深入浅出Objective-C笔记(四)

对象的初始化


  • 对象刚生成的初始值的多少?

    People *p = [ [People alloc] init ];
    
  • init方法的实现

    - (id) init { 
        self = [super init];
        if (self) {
            weight = 70.0;
            height = 1.8;
        }
        return self;
    }
    
    「id」是可以指向任何类型的指针类型。
    
     后续会用「instancetype」代替「id」
    
    「self」是每个对象预先内置在里面的变量。它表示的是对这个对象自身的引用。
    
    「super」引用的是这个对象的父类对象。
    
    先调用「super」对象的「init」方法,会完成一些必须的系统方面的初始化工作,
    并返回初始化后的对象引用。
    
    然后把初步初始化的对象返回给变量「self」
    
    self = [super init];是一个习惯写法,不必纠结细节。
    
    如果初始化失败,「super」的「init」方法会返回一个空指针(nill)。
    
    我们要在if条件里判断初步初始化的返回值是不是空「if(self)」,
    如果是空就不要继续进行自己的初始化工作。
    直接把空指针返回去就好了。
    
    如果成功了,就进入if语句块进行初始化,把体重初始化为70.0
    身高初始化为1.8
    
    但是有个问题,不可能每个人都是这种身高体重,所以我们希望每次创建people对象时,
    能根据具体情况给初值,这样才合理。
    
  • 增加一个带参数的初始化方法

    People *p = [ [People alloc] init ];是不带参数的初始化。
    init方法是继承来的,基本每个对象都有。
    但是,看了init方法的实现,发现有个问题,不带参数,固定了初始化值,
    这是不合理的,因为不可能每个对象的初始值都一样呀。
    

解决方案

 @interface People : NSObject
  {
      double height;
      double weight;
  }
  - (void) initWithHeight : (double)h andWeight : (double)w;//新加的初始化方法
  - (void) growUpByHeight : (double)h andWeight : (double)w;
  @end 

初始化方法的实现

- (id) initWithHeight : (double)h andWeight : (double)w {
    self = [super init];
    if (self) {
        weight = w;
        height = h;
    }
    return self;
  }

  所有类的初始化方法的实现在ObjC里框架基本一致。
小结

自己在类里写带参数的初始化方法

你可能感兴趣的:(深入浅出Objective-C笔记(四))