10.1 分配对象
向某个类发送alloc消息,能为类分配一块足够大的内存用来存放该类的全部实例变量,同时alloc还将这块内存区域全部初始化为0.
刚分配的对象并不能立即使用,需要先初始化。
初始化:从操作系统取得一块内存存储对象。
init方法返回其正在初始化的对象
10.11 初始化对象
注意:初始化方法返回的对象跟分配的对象可能不同。例:字符串初始化函数可能会决定创建一个不同类的对象。
10.12 编写初始化方法
//让超类完成其自身的初始化工作
self = [super init]
//更新self,以便其后的实例变量的引用可以被映射到正确的内存位置
if(self = [super init])
//如果init返回nil,表明未能初始化该对象
注意:将赋值和条件判断是一种常见的技术
10.13 初始化时要做些什么
两种不同的初始化方式:
1. init方法创建了该对象包含的其它对象
2. init方法只创建该对象本身
惰性求值(lazy evaluation):即使你目前没有设置自定义属性的值,也应该等到调用者需要时再创建对象。
10.2 便利初始化函数
便利初始化函数(convenience initializer):用来完成某些额外工作的初始化方法,可减轻负担。
如果对象必须要用某些信息进行初始化,那么应该将这些信息座位init方法的一部分添加进来。
10.3 更多部件改进
将轮胎的数组形式改为NSMutableArray形式
@interface Car : NSObject
{
NSMutableArray *tires;
}
-(void)setTire: (Tire *) tire atIndex: (int) index;
-(Tire *) tireAtIndex: (int) index;
init 方法:
- (id) init {
if (self = [super init])
{
tires = [[NSMutableArray alloc] init];
int i;
for (i = 0; i < 4; i++)
{
[tires addObject: [NSNull null]]; //添加4个NSNull对象
}
//初始化即生成4个元素的数组
}
return (self);
} // init
访问方法:
- (void) setTire: (Tire *) tire atIndex: (int) index
{
[tires replaceObjectAtIndex: index withObject: tire];
//以每个轮胎为单位
// 数组被销毁时,将释放数组中所有对象,tire也会被清理
}
- (Tire *) tireAtIndex: (int) index
{
Tire *tire;
tire = [tires objectAtIndex: index];
return (tire);
//可简化为:return([tires objectiveAtIndex: index]);
}
10.4 Car类的内存清理
原来创建tire对象方式:
Tire *tire;
tire = [[Tire alloc] init];
[tire setPressure: 23 + i];
[tire setTreadDepth: 33 - i];
重新定义init方法:
@interface Tire : NSObject
{
float pressure;
float treadDepth;
}
- (id) initWithPressure: (float) pressure treadDepth: (float) treadDepth;
- (void) setPressure: (float) pressure;
- (float) pressure;
- (void) setTreadDepth: (float) treadDepth;
- (float) treadDepth;
@end
新init方法实现:
- (id) initWithPressure: (float) p treadDepth: (float) td
{
if (self = [super init])
{
pressure = p;
treadDepth = td;
}
return (self);
}
创建tire对象新方式:
Tire *tire;
tire = [[Tire alloc] initWithPressure: 23 + i treadDepth: 33 - i];
10.5 指定初始化函数
tire类的四个初始化方法:
- (id) init {
if (self = [super init]) {
pressure = 34.0;
treadDepth = 20.0;
}
return (self);
} // init
- (id) initWithPressure: (float) p
{
if (self = [super init]) {
pressure = p;
treadDepth = 20.0;
}
return (self);
} // initWithPressure
- (id) initWithTreadDepth: (float) td
{
if (self = [super init]) {
pressure = 34.0;
treadDepth = td;```
}
return (self);
} // initWithTreadDepth
- (id) initWithPressure: (float) p
treadDepth: (float) td
{
if (self = [super init]) {
pressure = p;
treadDepth = td;
}
return (self);
} // initWithPressure:treadDepth:
Tire类新初始化方式:
- (id) init
{
if (self = [self initWithPressure: 34
treadDepth: 20]) {
}
return (self);
} // init
- (id) initWithPressure: (float) p
{
if (self = [self initWithPressure: p
treadDepth: 20.0]) {
}
return (self);
} // initWithPressure
- (id) initWithTreadDepth: (float) td
{
if (self = [self initWithPressure: 34.0
treadDepth: td])
{
}
return (self);
} // initWithTreadDepth
- (id) initWithPressure: (float) p
treadDepth: (float) td
{
if (self = [super init])
{
pressure = p;
treadDepth = td;
}
return (self);
} // initWithPressure:treadDepth:
Tire的子类的声明文件:
- (id) initWithPressure: (float) p treadDepth: (float) td
{ //根据父类的指定初始化函数编写
if (self = [super initWithPressure: p
treadDepth: td]) {
rainHandling = 23.7;
snowHandling = 42.5;
}
return (self);
} // initWithPressure:treadDepth
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-23 12:34:37