[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十章 对象初始化

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值