alloc init new的区别

初始化一个对象:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值