英文具体解释:http://macresearch.org/difference-between-alloc-init-and-new

1.在实际开发中非常少会用到new。一般创建对象咱们看到的全是[[className alloc] init]

可是并不意味着你不会接触到new,在一些代码中还是会看到[className new]。

还有去面试的时候。也非常可能被问到这个问题。

2.那么,他们两者之间究竟有什么差别呢

我们看源代码:

  1. + new
  2. {
  3. id newObject = (*_alloc)((Class)self, 0);
  4. Class metaClass = self->isa;
  5. if (class_getVersion(metaClass) > 1)
  6. return [newObject init];
  7. else
  8. return newObject;
  9. }
  10. //而 alloc/init 像这样:
  11. + alloc
  12. {
  13. return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
  14. }
  15. - init
  16. {
  17. return self;
  18. }

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

差别仅仅在于alloc分配内存的时候使用了zone.

这个zone是个什么东东呢?

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

3.而为什么不推荐使用new?

不知大家发现了没有:假设使用new的话,初始化方法被固定死仅仅能调用init.

而你想调用initXXX怎么办?没门儿!

据说最初的设计是全然借鉴Smalltalk语法来的。

传说那个时候已经有allocFromZone:这种方法,

可是这种方法须要传个參数id myCompanion = [[TheClass allocFromZone:[self zone]] init];

这种方法像以下这样:

  1. + allocFromZone:(void *) z
  2. {
  3. return (*_zoneAlloc)((Class)self, 0, z);
  4. }
  5. //后来简化为以下这个:
  6. + alloc
  7. {
  8. return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
  9. }

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

是不是又回到new那样的处理方式:在方法内部隐式调用init方法呢?

后来发现“显示调用总比隐式调用要好”,所以后来就把两个方法分开了。

概括来说,new和alloc/init在功能上差点儿是一致的,分配内存并完毕初始化。

区别在于,採用new的方式仅仅能採用默认的init方法完毕初始化,

採用alloc的方式能够用其它定制的初始化方法。

OC 中new与alloc/init的差别的更多相关文章

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

    在实际开发中很少会用到new,一般创建对象我们看到的全是[[className alloc] init],但是并不意味着你不会接触到new,在一些代码中还是会看到[className new],还有去 ...

  2. OC中两种单例实现方式

    OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...

  3. 关于self和super在oc中的疑惑与分析 (self= [super init])

    这个问题貌似很初级,但很容易让人忽略,me too .直到在一次面试时被问到,稀里糊涂的回答了下.实在惭愧, 面试一定都是很注重 基础的,不管高级还是初级. 虽然基础好跟基础不好都可以写代码,网上那么 ...

  4. OC中自定义init方法

    ---恢复内容开始--- 我们知道,在函数中实例化一个对象,大多数会同时进行初始化,如 Person *p =[ [Person alloc]init]; 此时已经进行了初始化,使用init方法,那么 ...

  5. OC中的@property详解

    简介: @property 生成了变量的get set 方法,同时指定了变量名称. 例如@property (nonatomic,strong) NSString *name;表示生成了_name私有 ...

  6. Swift: 比较Swift中闭包传值、OC中的Block传值

    一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...

  7. OC中的字典NSDictionary

    ========================== 字典 ========================== NSDictionary * dict = [[NSDictionary alloc] ...

  8. Oc中的数组

    ========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...

  9. OC中的内存管理

    一. 基本原理 1. 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需 ...

随机推荐

  1. 同一页面的两个Iframe获取数据

    首先页面: <td style="width: 50%" valign="top"> <iframe name="xxx" ...

  2. Sqlserver2008相关配置问题

    一:ReportServices  无法连接Report Services 数据库服务 SSRS连接不了ReportServer (安装数据库的时候默认安装的一个报表服务数据库) 原因:装系统之后改了 ...

  3. 2015 HDU 多校联赛 5363 Key Set

    2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php? pid=5363 依据前面给出的样例,得出求解公式 fn = ...

  4. [Sass] Level 3: Mixin -- Ex

    When to use MIXIN? Better way to use MIXIN is when you deal with browser prefiex, for example: @mixi ...

  5. Drupal 通过API动态的加入样式文件

    前面几篇文章中讲到关于样式的载入方式.已经了解到能够通过 theme.info 载入样式文件,但都须要更新缓存才干够使用.因些这样子没有办法动态的载入一些样式文件,在DP中提供了两个API操作样式文件 ...

  6. (算法)位图BitMap

    题目: 给定一数组,大小为M,数组中的数字范围为1-N,如果某带宽有限,无法传输该大小的数组,该怎么办? 思路: 通过位图BitMap来压缩数组,将数组中每个数字在bit位上标志,这样就可以将数组大小 ...

  7. [android错误] requires API level *

    Call requires API level (current min ): android.content.res.Resources#getBoolean 参考文档: http://stacko ...

  8. Wndows 主进程(Rundll32)已停止工作

        打开电脑,出现"windows 主进程(Rundll32)已停止工作",百度了一下,是文件损坏了.     下载一个新的文件,替换即可,若遇到权限问题,使用魔方工具中的设置 ...

  9. IE 之 应用小结

    1. 导出收藏夹(IE11) 导出:打开浏览器, 文件(F) → 导入和导出(M)... → 导出到文件(E) → 指定导出内容 → 指定保存路径导入:打开浏览器,文件(F) → 导入和导出(M).. ...

  10. mv命令(转)

    原文:http://www.cnblogs.com/peida/archive/2012/10/27/2743022.html mv命令是move的缩写,可以用来移动文件或者将文件改名(move (r ...