alloc init new的区别

来源:互联网 发布:wemall java版 编辑:程序博客网 时间:2024/06/10 08:50

初始化一个对象:

NSString *string=[NSString alloc];//开辟一个内存空间,并把地址返回给指针

NSLog(@"string=%p",string); // string=0x7fb32ae01880


string=[string init];//初始化

NSLog(@"string=%p",string);//string=0x1055d3390


打印地址不一样:

alloc是开辟一个内存空间,init是初始化,为什么初始化不在原有的内存空间上初始化,而是重新开辟一个内存空间,个人认为是方便构造后初始化不同的方法


NSObject *object=[NSObject alloc];

NSLog(@"object=%p",object);//

object=0x7fb32aea0680


   object=[object init];

NSLog(@"object=%p",object);//object=0x7fb32aea0680

打印地址一样:
看看init方法;
-(id)init{
if(self=[super init]){
----------
}
}
我们知道NSObject是一切类的基类,当[[NSString alloc]init]执行时, 调用的[super init]就是 NSObject中的init方法,既然NSObject身为基类,他也就无法调用super init, 所以 当NSObject执行 [[NSObject alloc]init]时,也就没有了init重新分配空间这一环节



new:

new 

id newObject = (*_alloc)((Class)self, 0); 

Class metaClass = self->isa; 

if (class_getVersion(metaClass) > 1) 

return [newObject init]; 

else 

return newObject; 

通过源码中我们发现,[className new]基本等同于[[className alloc] init];

0 0