码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-30 07:11:47      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:objective-c   ios   ios开发   对象初始化   

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:objective-c   ios   ios开发   对象初始化   

原文地址:http://blog.csdn.net/apple890111/article/details/47142037

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!