Object c中的alloc和init问题

从开始学的NSString *name=[[NSString alloc] init] 起,老师教这句话是分配内存空间,一直在用
从来没考虑过它的内部是怎么实现的.今天无意中看到了这一句代码
NSString *name=[NSString alloc];
        NSLog(@"%p",name);
name=[name init];
        NSLog(@"%p",name);

试着打印了一下,发现两个的内存地址不一样:
2014-07-07 13:19:51.724 LessonMRC2[1222:303] 0x100203850
2014-07-07 13:19:51.726 LessonMRC2[1222:303] 0x7fff73ada7b8
alloc是开辟一个内存空间,init是初始化,为什么初始化不在原有的内存空间上初始化,而是重新开辟一个内存空间
于是开始查资料,这时又发现了一个新的迷惑:
        NSObject *obj=[NSObject alloc];
        NSLog(@"%p",obj);
        obj = [obj init];
        NSLog(@"%p",obj);
打印之后:
2014-07-07 13:23:10.663 LessonMRC2[1232:303] 0x100103730
2014-07-07 13:23:10.665 LessonMRC2[1232:303] 0x100103730
怎么地址又变一样了
在打印NAArray的试一试
        NSArray *name=[NSArray alloc];
        NSLog(@"%p",name);
        name=[name init];
        NSLog(@"%p",name);
打印:
2014-07-07 13:26:15.154 LessonMRC2[1244:303] 0x100103740
2014-07-07 13:26:15.156 LessonMRC2[1244:303] 0x100102f50
仍然是不一样的.
原因是什么哪?
    首先看看NSStrng的init方法吧:
   -(id)init
        {
           if(self=[super init])  // 重新赋值了
          {
     。。。。
          }
        }

        从代码中可以分析, self=[super init]如果不为nil,就重新分配内存空间,这就解释了为什么 NSString,NSArray的调用alloc]init]方法后,内存地址会不一样,但是NSObject为什么会一样哪,我们知道NSObject是一切类的基类,当[[NSString alloc]init]执行时, 调用的[super init]就是 NSObject中的init方法,既然NSObject身为基类,他也就无法调用super init, 所以 当NSObject执行  [[NSObject alloc]init]时,也就没有了init重新分配空间这一环节

        至于苹果公司为什么初始化一个实例要分两步,我个人认为是方便构造后初始化不同的方法,如果用 new关键字,只能调用一个init,而不能调用initwithname等方法.

知识拓展:

    NSString  alloc之后,没有init,那么这部分alloc后的内存空间可不可以用?答案是显而易见的,如果可以用,苹果公司也就没必要提供一个init方法,那么alloc后的指针称为什么哪? 悬挂指针.  
如果一个地方指针既不为空,也没有被设置为指向一个已知的对象,则这样的指针称为悬挂指针。在程序里面是很危险的事.
当程序运行使用该指针时,程序不能判断指针的合法性,将会产生很严重的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值