初始化之alloca,init问题

                                  初始化之alloca,init问题

文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍

经常看到NSString *name=[[NSString alloc] init] 分配内存空间,一直在用,从来没考虑过它的内部是怎么实现的.无意中看到了这一句代码

  NSString *name=[NSString alloc];

        NSLog(@"%p",name);

        name=[name init];

         NSLog(@"%p",name);

打印了一下,发现两个的内存地址不一样:

   LessonMRC2[1222:303] 0x100203850

         LessonMRC2[1222:303] 0x7fff73ada7b8

alloc是开辟一个内存空间,init是初始化,为什么初始化不在原有的内存空间上初始化,而是重新开辟一个内存空间?????

下面的代码:

NSObject *obj=[NSObject alloc];

        NSLog(@"%p",obj);

        obj = [obj init];

        NSLog(@"%p",obj);

打印之后:

     LessonMRC2[1232:303] 0x100103730

     LessonMRC2[1232:303] 0x100103730

地址却一样了

对于NAArray:

NSArray *name=[NSArray alloc];

        NSLog(@"%p",name);

        name=[name init];

         NSLog(@"%p",name);

打印:

 LessonMRC2[1244:303] 0x100103740

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重新分配空间这一环节

加油吧,程序员!

猜你喜欢

转载自blog.csdn.net/weixin_42248302/article/details/82864213