创建新对象有两个方法:第一种方法就是[类名 new] ,第二种方法是[[类名 alloc ] init ],这两种方法时等价的。
在Cocoa里面常用的则是alloc和init方法。
alloc实际是allocation(分配),可以理解为初始化时分配出足够的内存空间。alloc方法将分配的内存初始化。所有的Bool类型初始化为NO,所有的int类型初始化为0,所有的float类型初始化为0.0,所有的指针被初始化为nil。
分配的对象是不能立即使用,必须初始化。
initialization(初始化)既是在操作系统取得内存,准备用于存储对象。
Car *car =[ [ Car alloc ] init];
而不是 Car * car =[Car alloc]; [car init]; 因为初始化方法返回的对象可能于分配的对象不同。
编写初始化方法 if(self=[superinit])
我们在CarParts程序中出现了两种初始化方式。第一种是在init方法中创建engine对象和4个trie对象。另一种则是不创建任何对象,而是为engine和tire对象预留位置。
即使不提供对自定义对象属性的调用,也仍然应该等到调用者需要时再创建对象。这种技术被称为惰性求值(lazy evaluation)
便利初始化函数(convenience initializer)
NSString *emptyString=[[NSString alloc] init];返回一个空字符串。
string =[[NSString alloc] initWithFormat:@"%d or %d" ,25,624]; 返回一个字符串。
string =[[NSString alloc] initWithContentsOfFile:(NSSting *) path];完成了打开文件读取数据块,追加字符串,确保零字节位于适当位置,以及关闭文件。
Tire类的初始化
@interface Tire :NSObject
{
float pressure; //轮胎花纹深度
float treadDepth; //轮胎压力
}
-(void) setPressure :(float) pressure; //set方法
-(void) setTreadDepth :(float) treadDepth; //set方法
-(float) pressure; //get方法
-(float) treadDepth; //get方法
@end
@implementation Tire
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
pressure=34.0;
treadDepth=20.0;
}
return self;
}
-(void) setPressure:(float)p
{
pressure=p;
}
-(void) setTreadDepth:(float)t
{
treadDepth=t;
}
-(float) pressure
{
return pressure;
}
-(float) treadDepth
{
return treadDepth;
}
- (NSString *) description
{
NSString *desc ;//因为desc不是通过alloc,copy 或new方法创建的,所以它在计数器值为1。当自动池销毁时,该字符串对象被清理
desc=[NSString stringWithFormat:@"Tire:Pressure:%.1f TreadDepth:%.1f",pressure,treadDepth];
return desc ;
}
@end
main()函数中
NSAutoreleasePool *pool;
pool=[[NSAutoreleasePoolalloc] init];
Car *car =[[Car alloc] init];
for(int i=0;i<4;i++)
{
Tire *tire =[[Tire alloc]init];
[tire setPressure:23+i];
[tire setTreadDepth:33-i];
[car setTire:tire atIndex:i];
//[tire release];
}
Engine *engine=[[Slant6 alloc]init];
[car setEngine:engine];
//[engine release];
[car print];
//[car release];
如果不在object-c2.0中则需要注释部分,因为object-c中有垃圾回收机制。
在Car类中我们可以用一个可变NSMutableArray来存储轮胎。以此简化代码。
- (id) init
{
if (self = [superinit]) {
engine = [[Enginealloc]init];
tires=[[NSMutableArray alloc]init];
for (int i=0; i<4; i++) {
[tiresaddObject:[NSNullnull]];
}
}
return (self);
}// init
- (Engine *) engine
{
return (engine);
}// engine
- (void) setEngine: (Engine *) newEngine
{
[newEngineretain];//保留以前传入的对象并释放当前对象
[enginerelease];
engine = newEngine;
}// setEngine
- (void) setTire: (Tire *) tire
atIndex: (int) index
{
[tiresreplaceObjectAtIndex: index withObject:tire];//从数组中删除现有对象并用新对象替代。
}// setTire:atIndex:
- (Tire *) tireAtIndex: (int) index
{
Tire *tire;
tire=[tiresobjectAtIndex:index];
return tire;
}// tireAtIndex:
-(void) dealloc
{
[tiresrelease];
[enginerelease];
}
- (void) print
{
for (int i=0; i<4; i++) {
NSLog(@"%@",[selftireAtIndex:i]);
}
NSLog(@"%@",engine);
初始化函数规则,如果构造一个初始化函数,则一定要在自己指定初始化函数中调用超类的指定初始化函数;如果不止一个初始化函数,则要选择一个指定初始化函数。