英文具体解释: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. iOS用户体验之-导航之道

    iOS用户体验之-导航之道 用户不会意识到有导航指向的存在除非他遇到非预期的效果. 能够说导航时逻辑跳转的节点.所以导航对用户体验是至关重要的. iOS中有三种类型的导航.每一种适合不同类型的app. ...

  2. Linux服务启动出现java.net.UnknownHostException:

    第一种情况: 一般是在/etc/hosts文件,在文件最后加入这句配置,重启服务即可   172.xx.xxx.xxx localhost.localdomain xxx-houtai1 第二种情况: ...

  3. 单页WEB应用(三),Chat聊天模块

    Chat 聊天模块 这个模块应该就是该书全篇的唯一一个模块吧,后面差点儿全部的篇章都环绕这个模块去实现的,只是就通过这一个模块的实现和上线,也能体现单页应用开发到公布上线的整个过程,毕竟后面的数据.通 ...

  4. MVC的Filter应用小结

    一.概念定义 Filter是一种声明式编程方式,在Asp.net MVC中它只能限制于Action(或它的Controller). Filter用途广泛:(1)判断登录与否或用户权限:(2)决策输出缓 ...

  5. 自我分析-Spring IOC

    Spring IOC容器实现原理大致是容器(Map)+反射(Java反射和cglib).Spring提供丰富的ApplicationContext.以FileSystemXmlApplicationC ...

  6. maven build 失败

    (1).之前项目打包都OK,不知道咋回事,突然出现如下图的问题: (2)上网查找了好多,一直没有解决,最后把本地maven库删除,重新运行了一遍,变成BUILD  SUCCESS,但是警告还是The ...

  7. sed备忘

    sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送 ...

  8. java 动态生成类再编译最后代理

    package spring.vhostall.com.proxy; public interface Store { public void sell(); } ------------------ ...

  9. 稀疏矩阵的加法(用十字链表实现A=A+B)

    描写叙述: 输入两个稀疏矩阵A和B,用十字链表实现A=A+B,输出它们相加的结果. 输入: 第一行输入四个正整数,各自是两个矩阵的行m.列n.第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数 ...

  10. scala class和object,trait的区别

    Scala类 1 2 3 4 5 6 7 8 9 10 11 12 13 class Counter {   private var value = 0 // 必须初始化字段   def increm ...