0x01 基本操作
在Objective-C中,复合是通过在一个类中声明一个指向另一个类对象的指针作为实例变量来实现的。
严格地说,只有对象间的组合才能叫做复合。
如果只是int、float、enum和struct等基本类型就只能说是对象的一部分。
@interface Unicycle : NSObject
{
Pedal *pedal;
Tire *tire;
}
@end // Unicycle
0x02 复合举例
假设我们现在把整个程序视为一部车,这部车有4个轮子,1个发动机。
首先描述轮子:
@interface Tire : NSObject
@end // Tire
@implementation Tire
- (NSString *) description {
return (@"I am a tire. I last a while.");
} // description
@end // Tire
然后,我们描述发动机:
@interface Engine : NSObject
@end // Engine
@implementation Engine
- (NSString *) description
{
return (@"I am an engine. Vrooom!");
} // description
@end // Engine
这里的description方法并没有在Tire类的接口中声明,因为它是定义在NSObject类中的。
description方法默认返回对象的描述信息,即默认返回类名和对象的内存地址。
再接下来,我们描述整台汽车:
@interface Car : NSObject
{
Engine *engine;
Tire *tires[4];
}
- (void) print;
@end // Car
@implementation Car
- (id) init
{
if (self = [super init]) {
engine = [Engine new];
tires[0] = [Tire new];
tires[1] = [Tire new];
tires[2] = [Tire new];
tires[3] = [Tire new];
}
return (self);
} // init
- (void) print
{
NSLog (@"%@", engine);
NSLog (@"%@", tires[0]);
NSLog (@"%@", tires[1]);
NSLog (@"%@", tires[2]);
NSLog (@"%@", tires[3]);
} // print
@end // Car
程序中,if ( self = [super init] )这个语句是初始化对象中非常常见的。
典型的,在iOS下,所有的类都继承于NSObject,而NSObject的init方法很简单,就是return self,self指向被初始化的对象。
使用new创建对象的时候,实际发生了两个步骤。
第一步,为对象分配内存,也就是说对象获得存储其实例变量的内存块;
第二步,就是调用NSObject的init方法,初始化对象使其处于可用状态。没有被初始化的指针都返回nil, 那么if条件为假,也就会初始化失败。
将[super init]返回的结果赋给self是Objective-C的惯例,这么做是为了防止超类在初始化的过程中返回的对象与一开始创建的不一致。
相对的,我们也可以写出if(self = nil),然后把我们在初始化失败后要做的工作写在往下的语句里。
这里如果不能理解,只需要记住把要做的工作写进if里,后续学完之后回头就能看明白了。
最后,我们当然是写main()函数:
int main (int argc, const char * argv[])
{
Car *car;
car = [Car new];
[car print];
return (0);
} // main
运行后的输出结果类似如下:
I am an engine. Vrooom!
I am a tire. I last a while.
I am a tire. I last a while.
I am a tire. I last a while.
I am a tire. I last a while.