源码:

+ new{id newObject = (*_alloc)((Class)self, 0);Class metaClass = self->isa;if (class_getVersion(metaClass) > 1)return [newObject init];elsereturn 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的方式可以用其他定制的初始化方法。

一、new与alloc init的区别相关推荐

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

    为什么80%的码农都做不了架构师?>>>    在实际开发中很少会用到new,一般创建对象我们看到的全是[[className alloc] init],但是并不意味着你不会接触到n ...

  2. git init 与 git init --bare 区别

    git init 与 git init --bare 区别 发现问题 最早是在公司的wiki上发现了这个命令,google后发现值得记录下来 实践中发现的区别 网上找了很多资料,但说的很乱,干脆在自己 ...

  3. initWithNibName与一般init的区别

    init只是加载就行,有没有xib无所谓: 但是initWithNibName需要xib文件,如果该文件不存在则报错: 网上查看了一下,还有和loadNibNamed的区别和联系,暂时我也没用过这个l ...

  4. linux关机_Linux中shutdown,halt,poweroff,init 0区别

    1)shutdown命令 我们较常使用的是shutdown这个命令,这个命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息.该命令还允许用户指定一个时间参数 ...

  5. Linux /etc/rc.d 下面 rc${runlevel}.d rc.local init.d 区别

    一:init.d init.d 存放的是各种系统跟多服务的开始停止脚本等,/etc/init.d 是 /etc/rc.d/init.d 的软链接. 二:/rc.d/rc${runlevel}.d  这 ...

  6. iOS 疑难杂症 学习笔记

    iOS Learing note 出现问题:虚拟机 Xcode 调试时候发现键盘出不来 错误提示:Xcode 提示: Can't find keyplane that supports type 8 ...

  7. iOS开发基本功的那些事儿(未完待续)

    Objc 一.三大特性 1.封装_点语法 2.继承 3.多态 1> 什么是多态 多态:不同对象以自己的方式响应相同的消息的能力叫做多态. 由于每个类都属于该类的名字空间,这使得多态称为可能.类定 ...

  8. 100家知名企业今年来iOS面试题合集:

    你要的这里都有: 企业要的这里也有: 从基础开始到进阶.深入底层 整理出188个面试题,全是干货 这些全部是题目跟类目,每个题目都会有相对的答案,由于字数太多所以我整理出一个文档,文档获取地址,进作者 ...

  9. 【原】NSMutableArray的alloc、init方法与array的区别疑问

    在项目中的这个函数里面,[NSMutableArray array]与[[NSMutableArray alloc] init];有着较明显的区别 同样是建立一个NSMutableArray临时变量, ...

最新文章

  1. 苹果新功能惹众怒,4000 多家组织和个人签署公开信,敦促苹果放弃“儿童安全”功能...
  2. Leetcode334反转字符串[C++题解]:双指针
  3. 遍历一个类中的每一个属性、方法、公共字段
  4. 布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项
  5. POJ 1703 Find them, Catch them 种类并查集
  6. beeline连接hiveserver2报错:User: root is not allowed to impersonate root
  7. jitter 如何优化网络_抖音优化该怎么做?
  8. 《软件需求》学习笔记
  9. IDES SAP SEM 4.0/SAP BW 3.50 笔记本安装手册
  10. NHibernate版本不一致问题
  11. linux键盘修改工具,Linux 键盘映射的修改(Console)
  12. 98五笔86五笔及五笔字型口诀字根表
  13. zipf分布c/c++
  14. 三分钟快速解决vs2015连接数据库显示该文件正在使用/该sql文件被占用等问题
  15. ubuntu编辑只读文件_ubuntu怎么样修改只读文件
  16. 毕业设计 STM32老人防摔倒报警系统 - 物联网 嵌入式 单片机
  17. Unity3D 2021.1.1F1。更新与下载。
  18. Week8学习总结-数据库
  19. 浅谈什么是web应用防火墙(WAF)
  20. 01 JDK8安装教程

热门文章

  1. DevExpress的分隔条控件SplitterControl的使用
  2. 怎样快速使用富文本编辑器
  3. webpack的入口起点(EntryPoints)
  4. 【编程3】二叉树遍历(LeetCode.102)
  5. linux中mbr最大多少分区,Linux与磁盘分区介绍(MBR,GPT)
  6. java jdk目录_Java开发工具包JDK安装和目录介绍
  7. 重磅 | 品牌零售行业数据驱动业务指南,全新上线!
  8. StarlingMVC Framework中文教程
  9. 两种方式:mysql查看正在执行的sql语句
  10. 数学模型与数据结构的丝连