Obejctive-C 启程
您目前处于:技术核心竞争力  2015-02-18

Objective-C 语言是以 C 语言为基础的一个扩展集,OS X 和 iOS 平台上的应用程序都是用该语言来开发的。

Cocoa 是针对 OS X 系统提供的工具包,Cocoa Touch 是针对 iOS 系统提供的工具包。他们都是用 Objective-C 语言编写的,里面包含了 OS X 和 iOS 系统的所有用户界面元素和其他相关内容。

Cocoa 和 Objective-C 是 OS X 和 iOS 操作系统的核心。Xcode 是用来创建 iOS 和 OS X 应用程序的开发环境。

对 C 的扩展

Xcode 通过 .m 扩展名来表示文件使用的是 Objective-C 代码,应由 Objective-C 编译器处理处理。C 编辑器处理 .c 文件,C++ 编译器处理 .cpp 文件。在 Xcode 中,所有这些编译工作默认由 LLVM 处理,这个编译器能够理解 C 语言的全部3个变体。

Objective-C 刚诞生的时候,扩展名 .m 代表 message,它指的是 Objective-C 的一个主要特性。

Objective-C 使用头文件来包含结构体、符号常量和函数原型等元素的生命。在 C 语言中用 #incude 语句来通知编译器查询文件中相应的定义代码。在 Objective-C 中通过 #import 语句。#import 是由 Xcode 使用的编译器提供的,#import 可保证头文件只被包含一次,无论此命令在该文件中出现了多少次。

什么是框架?框架是一种把头文件、库、图片、声音等内容聚集在一个独立单元的集合体。

Cocoa 给其所有的函数、常量和类型名称都添加了 NS 前缀。这个前缀告诉我们函数来自 Cocoa 而不是其他工具包。

NSLog() 语句:

NSLog(@"Hello, Objective-C!");

@ 符号是 Objective-C 在标准 C 语言基础上添加的特性之一。@ 符号意味着引号内的字符串应作为 Cocoa 的 NSString 元素来处理。

NSLog() 本质上就是具有 Cocoa 特色的 printf() 函数,它接受格式化字符串,并将后续参数的值插入到这个格式说明符中。

面对对象编程的基础知识

面对对象编程 OOP 是一种编程架构,可构建由多个对象组成的软件。

在 Objective-C 中只要看到 @ 符号,就可以把它看成是对 C 语言的扩展。

@interface Circle : NSObject
{
}

@interface 行中的 NSObject 告诉编译器,Circle 类是基于 NSObject 类的。

@interface 用于定义类的公共接口,@implementation 是一个编译器指令,表明将为某各类提供代码。

在 Objective-C 中调用方法时,一个名为 self 的秘密隐藏参数将被传递给接收对象,而这个参数引用的就是该接收对象。

实例化对象时,需要分配内存,然后将这些内存初始化并保存为有用的默认值,这些值不同于通过新分配的内存获得的随机值。内存分配和初始化工作完成之后,就意味着新的对象实例已经创建好了。

为了创建一个新的对象,我们需要向相应的类发送 new 消息。该类接受并处理完 new 消息后,我们就会得到一个可以使用的新对象实例。

继承

@interface Circle : NSObject

冒号后面的标识符是需要继承的类。在 Objective-C 中,你可以选择不继承,但如果你使用 Cocoa 框架,就需要继承 NSObject 类,因为它提供了大量有用的特性。

在 Objective-C 不支持多继承。

在对象接收到消息时,如果知道要执行哪个方法呢?当代吗发送消息时,Objective-C 的方法调度机制将在当前的类中搜索相应的方法,如果无法在接收消息的对象的类文件中找到相应的方法,它就会在该对象的超类中进行查找。

在创建一个新类时,其对象首先会从它的超类继承实例变量,然后根据自身情况添加自己的实例变量。

因为继承在子类和超类之间建立了一种"is a"的关系,所以NSObject的实例变量叫做 isa。

每个方法调用都获得了一个名为 self 的隐藏参数,它是一个指向接收消息的对象的指针。

方法调用机制在运行重写后方法,超类中定义的所有的实现都会被完全忽略掉。Objective-C 提供了一种方法,让你既可以重写方法的实现,又能调用超类中的实现方法。当需要超类实现自身的功能,同时在之前或之后执行某些额外的工作时,这种机制非常有用。为了调用继承的方法在父类中的实现,需要使用 super 作为方法调用的目标。

复合

在 Objective-C 中,复合是通过包含作为实例变量的对象指针实现的。

@interface Car : NSObject
{
    Engine *engine;
    Tire *tires[4];
}
- (void) print;
#end // Car

因为 engine 和 tires 是 Car 类的实例变量,所以它们是复合的。每一个 Car 对象都会为指向 engine 和 tries 的指针分配内存,但是真正包含在 Car 中的并不是 engine 和 tries 变量,只是内存中存在其他对象的引用指针。为新建 Car 对象分配内存时,这些指针将被初始化为 nil。

使用 new 创建新对象时,系统其实在后台执行了两个步骤:第一步,为对象分配内存,即对象获得一个用来存放实例变量的内存块;第二步,自动调用 init 方法,使该对象进入可用状态。

存取方法是用来读取或改变某个对象属性的方法。如果要对其他对象中的属性进行操作,应该尽量使用对象提供的存取方法,绝对不能直接改变对象里面的值。

get 这个词在 Cocoa 中有特殊的含义。如果 get 出现在 Cocoa 的方法名中,就意味着这个方法会将你传递的参数作为指针来返回数值。

继承的类之间建立的关系是"is a",复合的类之间建立的关系是"has a"

源文件组织

Objective-C 类的源代码分为两部分。一部分是接口,用来展示类的构造。接口包含了使用该类所需的所有信息。编译器将 @interface 部分编译后,你才能使用该类的对象,调用类方法,将对象复合到其他类中,以及创建子类。

源代码的另一个组成部分是实现。@implementation 部分告诉 Objective-C 编译器如何让该类工作。这部分代码实现类接口所声明的方法。

创建新类时,Xcode 会自动生成 .h 和 .m 文件。

Xcode 中有一个与项目同名的群组,文件都放在群租内的文件夹中。在设置群组时,Xcode 并不会在硬盘上移动文件或者创建目录。群组关系仅仅是由 Xcode 负责管理的一项奇妙的功能。

导入头文件有两种方法:使用引号或者尖括号。带尖括号的语句用于导入系统头文件,而带引号的语句则说明导入的是项目本地的头文件。如果你看到的头文件名是用尖括号括起来的,那么这个头文件对你的项目来说是只读的,因为它属于系统。如果头文件名前后用的是引号,那么你便可以编辑它。

导入头文件使头文件和源文件之间建立一种紧密的依赖关系。如果头文件有任何变化,那么所有依赖它的文件都得重新编译。


转载请并标注: “本文转载自 linkedkeeper.com ”  ©著作权归作者所有