对象和消息

消息表达式

在Objective-C中,id类型是一个独特的数据类型。id类型的变量可以存放任何数据类型的对象。定义一个id类型变量obj的方法如下:

1
id obj;

而向obj发送msg消息的语法如下:

1
[obj msg];

这就是消息表达式的语法。其中,消息接收者是一个对象。
Objective-C允许嵌套消息表达式,每个消息表达式的返回值都可以作为消息的接收者,继续接收消息

1
[[[obj msg1] msg2] msg3];

消息由消息关键字组成,消息关键字的命名规则同变量名的命名规则一样。
消息关键字的末尾有”:”时,表示这个消息带有参数。“:“后面紧跟的就是实际的参数

1
[printInfo setLeftMargin: 60.0];

发送带有多个参数的消息的时候,可以通过多个“关键字: 变量“的写法完成调用。也可以省略关键字而至通过”:”将变量连接起来

1
2
[manager fileExistsAtPath: dirname isDirectory: &isDir];
[view lineTo: 1.412: (y + 1.0)];

函数通过函数名来区分,而在Objective-C中,消息是通过消息名进行区分的。带参数和不带参数的消息名,例如”copy”和”copy:”是不同的消息名。

实例变量的生成和初始化

在OC中使用一个对象前,首先需要调用类的构造函数以生成对象。

1
[类名 alloc];

alloc执行后即可完成对象所需空间的分配。但还没有对对象进行初始化。不同的类会提供不同的初始化方法,同一个类也可能提供多个初始化方法。
Cocoa中的初始化方法通常都是init或以init开头。下面的语句完整地创建并初始化了Cocoa中的某个类

1
[[类名 alloc] init]

另外,对象生成后只能调用一次初始化方法,来为对象中的各个变量设置初值。但是初始化方法不具备将对象中的信息重置的功能。如果需要将对象中的属性重置,则需要额外实现一个函数。
另外,有的类的方法会返回一个初始化好的对象,所以可以不通过alloca而使用别的方法来生成对象。

类的接口声明

在OC中,接口(interface)和实现(implementation)是分离开的。
类的接口部分定义了类的实例变量和方法。类的接口声明通常声明为头文件,提供给要调用这个类的模块引用。接口的定义如下:

1
2
3
4
5
6
7
8
9
@interface 类名 : 父类
{
实例变量的定义;
...
}
方法声明;
...

@end

在Objective-C中,类接口的声明以编译指令@interface开头,以@end结尾。所有Objective-C编译指令都以@字符开头。
实例变量的声明和C语言中定义变量的方法一样,使用变量类型 变量名的形式。
而方法的声明如下:

1
-  (id)callAtRow: (int)row column:(int)col;

类的实现

类的实现部分以编译指令@implementation开始,以@end结束。具体语法如下:

1
2
3
4
@implementation
方法的实现
...
@end

类的实现部分不用再次声明父类。实现部分包含了接口部分声明的所有方法的实现。
方法实现部分的第一行代码和方法声明部分完全相同,以后接上{},并将具体实现的代码写在{}里面。
方法内部可以自由使用类的实例变量。