博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C中new与alloc/init的区别
阅读量:6404 次
发布时间:2019-06-23

本文共 1246 字,大约阅读时间需要 4 分钟。

  hot3.png

在实际开发中很少会用到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的方式可以用其他定制的初始化方法。

转载于:https://my.oschina.net/chars/blog/615533

你可能感兴趣的文章
小程序开发注意事项
查看>>
ECMAScript7规范中的instanceof操作符
查看>>
Hadoop HDFS原理分析
查看>>
【webpack4】基本配置和入门api
查看>>
Mac使用ssh公钥登录Linux
查看>>
【366天】跃迁之路——程序员高效学习方法论探索系列(实验阶段124-2018.02.06)...
查看>>
POJ3070-Fibonacci(矩阵快速幂)
查看>>
[vue插件]基于vue2.x的电商图片放大镜插件
查看>>
标准的组件结构
查看>>
vue——一个页面实现音乐播放器
查看>>
SVG 扬帆起航
查看>>
NET Core-学习笔记(二)
查看>>
职业生涯上的点点滴滴
查看>>
Linux下添加新硬盘,分区及挂载
查看>>
一起来将vscode变成私人定制笔记本
查看>>
Flutter 云音乐
查看>>
RecyclerView实现多type页面
查看>>
个人的web商城网站
查看>>
debian fcitx
查看>>
排中律与实无穷问题的性质分析
查看>>