英文具体解释: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. JS/JQuery获取当前元素的上一个/下一个兄弟级元素等元素的方法

    $(function(){ //遍历获取的input元素对象数组,绑定click事件 var len = $("input[type='file']").length; ; i & ...

  2. JS计算本周一和本周五的日期

    代码不长: var today=new Date();var weekday=today.getDay();    var monday=new Date(1000*60*60*24*(1-weekd ...

  3. 在 Ubuntu 12.04 上通过源码安装 Open vSwitch (OVS)

    安装 Ubuntu 12.04, 而且更新系统 apt-getupdate; apt-getupgrade; 安装所需的package apt-get install automake autocon ...

  4. 拓展javascript内置函数

    1.获取字符串字节数 //获取字符串字节数 //方法一 /* */ String.prototype.getBytesLength = function () { var length = 0; fo ...

  5. Linux虚拟机下使用USB转串口线——配置minicom、以及screen的使用

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_637212.HTM 环境:Windows XP + (VMware Workstation - Linux) 1.确保 ...

  6. Mac Oracle SqlDeveloper 快捷输入

    用惯了 plsql 的快捷输入,换了 Mac Oracle SqlDeveloper反倒是找不到了,翻出去找了几次终于找到 SqlDeveloper -- preferences -- 数据库(dat ...

  7. Spring <context:annotation-config/> 说明

    在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config/>这样一条配置,他的作用是式地向 Spring 容器注册AutowiredAn ...

  8. winform网络编程之TcpClient类,TcpListener类和UdpClient类

    TcpClient类和TcpListener类 (1)TcpClient的用途: 用于在同步阻止模式下通过网络来链接.发送和接受流数据,在此情况下,必须有侦听此连接的请求,而侦听的任务就交给TcpLi ...

  9. 〖Linux〗联想K860/i Android 4.2及以上的Bootimg解压与打包工具

    因为自己有需要,所以花了一点时间来写了一下. 1. 解压工具 #!/bin/bash - #====================================================== ...

  10. python之函数用法__getitem__()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法__getitem__() #http://www.cnblogs.com/hongf ...