alloc/init和new的区别(其实没区别)

 在开发中,创建一个对象我们有如下方式:

NSObject *obj_1 = [[NSObject alloc]init];
NSObject *obj_2 = [NSObject new];
先看看new源码:
+ (id)new
{
    id newObject = (*_alloc)((Class)self, 0);
    Class metaClass = self->isa;
    if (class_getVersion(metaClass) > 1)
        return [newObject init];
    else
        return newObject; 
}
alloc/init源码:
+ (id)alloc
{
    return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
 
- (id)init
{
    return self;
}

可以看出,两种方式基本上一致。区别上从_alloc和_zoneAlloc中可以看出,alloc 使用了_zoneAlloc , 它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度。
但如果使用new的话,初始化方法被固定死只能调用init.不能再使用init开头的其它初始化方法,据说最初的设计是完全借鉴Smalltalk语法来的,传说那个时候已经有allocFromZone:这个方法,只是给对象分配了内存,并没有初始化实例变量,但是这个方法需要传个参数id myCompanion = [[TheClass allocFromZone:[self zone]] init];
这个方法像下面这样:

+ allocFromZone:(void *) z
{
    return (*_zoneAlloc)((Class)self, 0, z);
}
 
//后来简化为下面这个:
+ alloc
{
    return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}


并且allocFromZone:在苹果文档上已经说明,这个方法是因为历史原因所存留,它的参数zone可以直接无视,已经不再在object-c上使用,也不需要再重写这个方法。
官网的说法,alloc方法即使重写也不要写任何初始化的操作,它其实也调用了allocFromZone。

总的来说,两种方式创建对象现在基本上一样,区别就是使用new只能默认init进行初始化,alloc方式可以使用其它的init开头的方法进行初始化。

还有一点,在其实默认的init方法中 , 什么都没有做,直接返回了self , 所以,如果没有重写init的话, [Class alloc] 和 [[Class alloc]init] 是等价的.

原文 : https://blog.csdn.net/u010637448/article/details/52494164 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值