黑马程序员-OC语言核心语法(2)构造方法

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


0.概念  
  定义:用来初始化对象的方法,是个对象方法。 - 开头
  目的:为了让对象创建出来,成员变量就拥有固定值(默认是空,0)
  注意点:(1)先调用父类的构造方法(eg:[super init])
                  (2)再进行子类内部成员变量的初始化

 1.完整的创建一个可用对象过程
      (1)分配存储空间:使用     +alloc 给对象分配空间 (返回一个分配了空间的对象,但是没有初始化)
            
Person *p1 = [Person alloc];

      (2)初始化  使用  -init 初始化对象 
           
 Person *p2 = [p1 init];

      以上可以归纳为 Person *p3 = [[Person alloc] init];  // init 是个构造方法,属于NSObject类中

2. 重写init方法(构造方法)
  1>范例
- (id)init // 返回值一定要是id  
    {   
       // 1. 一定要调用super的init方法(初始化父类的相应方法和成员变量)  
          self = [super init];  // 返回已经初始化了的当前对象 self  
      // 2.如果对象初始化成功,才有必要进行接下来的初始化(对变量的初始化进行赋值)  
      if ( self )  
           { // 初始化成功  
               _age = 10;  
           }  
       // 3.返回一个已经初始化了的对象  
       return self;  
   /* 
     简写: 
         if( self = [super init]) 
              { 
                      _age=10; 
             } 
                return self; 
  */  
   }

  注:在调用时,先赋值父类成员变量,一层层往下赋值,从NSObject开始。

2>  执行过程:
   
解释:
          第一步:调用student对象,在对student对象进行初始化的时候,会调用父类的init方法,也就是Person类的init。
          第二步:初始化Person对象的init方法,会调用父类的init,也就是NSObject类的init方法。
          第三步:初始化NSObject类的init方法,此方法会有个指针ISA指向Student类,NSObject类的init方法初始化完毕。
          第四步: NSObject类的init方法初始化完毕后,此时Person类的init方法就会有值,Person类的init方法初始化完毕。
          第五步:Person类的init方法初始化完毕后,就会初始化Student类的init方法。
  
注:student初始化时调用person的init方法。person初始化时调用NSObject的init方法。
  赋值顺序:首先赋值ISA,然后再赋值_age,最后初始化_no(从父类开始赋值)
  初始化顺序:1>先初始化父类,然后再初始化子类。但是调用的时候先调用子类的方法,再调用父类方法
                       2>先初始化自身的ISA,然后再初始化其它成员变量。

3.自定义构造方法
   规范:(1)一定是对象方法,一定以 - 开头。(调用某个对象方法进行初始化
              (2)返回值一定是id类型
              (3)方法名一般是以init开头。
              (4)成员变量数量:自有成员变量加父类成员变量。(NSObject默认有成员变量ISA)
      eg: 
- (id)initWithAge:(int)age // 设置age的初始化方法  
 {  
     if (self = [super init]) // 初始化是否成功  
     {  
          _age = age;  
      }  
      return self;  
 } 
 
int main()  
{  
      Person *p = [[Person alloc ] initWithAge:29]; // 如果初始化 成功,则age默认为29;  
}

原则:父类的成员变量父类处理,子类的成员变量子类处理。

4.new方法和alloc、init方法区别
 (1) new 是分两步来生成对象的
      1> 调用+alloc 方法来给对象分配内存空间
      2>调用-init 方法给对象的成员变量初始化成默认的值
缺点:不能在创建对象的同时进行一些必要的初始化值

  (2)alloc、init方法
优点:可以在对象初始化时,使成员变量拥有必要的初始化值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值