Objective-C中new与alloc/init的区别

在实际开发中很少会用到new,一般创建对象我们看到的全是[[className alloc] init],但是并不意味着你不会接触到new,在一些代码中还是会看到[className new],还有去面试的时候,也很可能被问到这个问题。

那么,它们两者之间到底有什么区别呢?我们先来看源码:

+ new {
    id newObject = (*_alloc)((Class)self, 0);
    Class metaClass = self->isa;
    if (class_getVersion(metaClass) > 1)
        return [newObject init];
    else
        return newObject;
}         

而 alloc/init 像这样

+ alloc {
    return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
} 

- init {
    return self;
}

通过源码中我们发现,[className new]基本等同于[[className alloc] init],区别只在于alloc分配内存的时候使用了zone。

那么,这个zone是个什么东西呢?

它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度。

为什么不推荐使用new?

不知大家发现了没有,如果使用new的话,初始化方法被固定死只能调用init。而你想调用initXXX怎么办?没门儿!据说最初的设计是完全借鉴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());
}

但是,出现个问题:这个方法只是给对象分配了内存,并没有初始化实例变量。

是不是又回到new那样的处理方式:在方法内部隐式调用init方法呢?后来发现“显示调用总比隐式调用更好”,所以后来就把两个方法分开了。

概括来说,new和alloc/init在功能上几乎是一致的,分配内存并完成初始化。差别在于,采用new的方式只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法。

时间: 2024-08-02 11:04:54

Objective-C中new与alloc/init的区别的相关文章

iOS开发中 new与alloc/init的区别 及 [NSArray array] 和 [[NSArray alloc]init] 及 self. 和 _ 的区别

项目过程中,想到这几个概念的区别有些模糊,于是纵观各种资料,来篇博文为自己记录下,也为小伙伴们说说我的理解. [className new] 和 [[className alloc] init] 的区别 1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看到[[className alloc] init], 还有去面试的时候,也很可能被问到这个问题. 2.那么,他们两者之间到底有什么区

OC 中new与alloc/init的区别

英文详解:http://macresearch.org/difference-between-alloc-init-and-new 1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看到[className new], 还有去面试的时候,也很可能被问到这个问题. 2.那么,他们两者之间到底有什么区别呢 我们看源码: + new { id newObject = (*_alloc)((C

iOS开发new与alloc/init的区别

概括来说,new和alloc/init在功能上几乎是一致的,分配内存并完成初始化.差别在于,采用new的方式只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法. AD: 英文详解:http://macresearch.org/difference-between-alloc-init-and-new 1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看

iOS new和alloc init的区别

今天同事跟我说新项目要求统一采用 [[xxx alloc]init]的方式创建,不要使用new. 于是宝宝心里就好奇了,为什么呢,在我的认知中,new和alloc init是一样的作用啊, 于是在网上搜了一下,发现了一篇有价值的文章,摘录下来与大家分享. 1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看到[className new], 还有去面试的时候,也很可能被问到这个问题.

array=nil 和 Array=[[NSMutableArray alloc]init]; 的区别

情况1: array=nil; [_PayArray addObject:BillDetail]; 此时array还是nil:因为array没有分配地址应该. 情况2: Array=[[NSMutableArray alloc]init]; [_PayArray addObject:BillDetail]; 此时array添加BillDetail成功.

new和alloc init的区别

背景说明,new是较为老式的写法,后来发现只有一个new不好使,才引入了alloc和init这种写 法,保留new一是向后兼容,二是很多时候是一种更简单的写法.其实是一样的,new在内部调用 的alloc和init. 源代码: + new { ? ? id newObject = (*_alloc)((Class)self, 0); //申请空间 ? ? Class metaClass = self->isa; ? ? Class metaClass = self->isa; ? ? retu

objective C中继承、协议、分类和多态的实现

第一.objective C中继承的实现 在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号 在OC中可以像C++一样用指针运算法来访问实例变量 Rectangle.h 文件代码: #import <Foundation/Foundation.h> @interface Rectangle : NSObject { int _width; int _height; } @property (non

Objective - C中属性和点语法的使用

一.属性 属性是Objective—C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性 OC中的属性机制提供了便捷的设置和获取实例变量的方式,或者说属性提供了一个默认的设置器和访问器的实现:属性提供的方法是现实可配置的,属性的好处:相当于自己编写这一对方法,属性提供了一系列清晰分明的说明参数来定义设置器和访问器的行为,编译器可以根据你设置的说明参数为你生成相应的方法,减少你的代码量和维护工作量 设置器(sette

Objective C中数组排序几种情况的总结

总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 数组排序 Objective-C 目录[-] 1.简单排序(sortedArrayUsingSelector:) 2.利用block语法(sortedArrayUsingComparator:) 3.高级排序(sortedArrayUsingDescriptors:) 大体上,OC中常用的数组排序有以下几