iOS 初始化方法 alloc init 与 new 的区别
来源:互联网 发布:网页淘宝怎么退出登录 编辑:程序博客网 时间:2024/06/09 14:30
class * aclass = [[class alloc]init];
这行代码被我们写了无数遍,同时几乎所有人都知道 class * aclass = [class new];
的存在。
那么 [[class alloc]init]
和[class new]
到底有什么区别呢?该如何使用呢?
照例开扒文档
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/#//apple_ref/occ/clm/NSObject/alloc
Allocates a new instance of the receiving class, sends it an init message, and returns the initialized object.
分配出一个接受类的新实例,向这个实例发送一个 init 消息,然后返回一个该类的初始化对象。This method is a combination of alloc and init.
这个方法是 alloc 和 init 的一个组合。
可以看到,[class new]
只是将[[classalloc] init]
组合了起来 ,同样都是分配内存完成对象初始化。那么他们有什么不同的地方呢?
上代码
+ new{id newObject = (*_alloc)((Class)self, 0);Class metaClass = self->isa;if (class_getVersion(metaClass) > 1)return [newObject init];elsereturn newObject;}
+ alloc{return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());}- init{return self;}
可以看到的一个区别是
alloc 分配内存时使用的是(*_zoneAlloc)((Class)self, 0, malloc_default_zone())
。
这串东西的演化是这样的:
+ allocFromZone:(void *) z{return (*_zoneAlloc)((Class)self, 0, z);}+ alloc{return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());}
关于这个方法查询到的是,在给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度(其实还是分配内存而已)。
另外一个区别则是,[class new]
里在发送初始化消息时使用的是 init,也就是说我们无法调用一个类的 initWithxxx方法。
so,[class new]
并没有什么奇特,只不过是让你少写了几个字母。
总结下来,[class new]
和[[classalloc] init]
几乎是一致的,分配内存创建实例然后发送 init 消息完成一个类的实例化。
使用[class new]
会更省事,更简洁,但是只能调用 init 方法,无法使用其他自定义的初始化方法。
使用[[class alloc] init]
,显式的调用 分配内存 和 初始化 方法,同时也可以实现 initxxxx。
- iOS 初始化方法 alloc init 与 new 的区别
- iOS new与alloc/init的区别
- iOS开发:new 与alloc/init 的区别
- iOS开发new与alloc/init的区别
- iOS开发 new与alloc/init的区别
- iOS开发new与alloc/init的区别
- iOS开发new与alloc/init的区别
- iOS中new与alloc/init的区别
- iOS开发之new与alloc/init的区别
- iOS开发new与alloc/init的区别
- iOS开发new与alloc/init的区别
- iOS开发之new与alloc/init的区别
- iOS开发new与alloc/init的区别
- iOS开发new与alloc/init的区别
- iOS开发new与alloc/init的区别
- iOS开发new与alloc/init的区别
- iOS开发new与alloc/init的区别
- iOS开发new与alloc/init的区别
- 安卓初识基础控件_CheckBox
- 用Maven创建第一个web项目(1)
- caffe 中的卷积的计算过程
- 细说IOS中的静态变量static
- java入门之GC的算法与种类(4)
- iOS 初始化方法 alloc init 与 new 的区别
- UVA - 1374 - Power Calculus(迭代加深)
- NumPy 数组矩阵运算
- 程序员应该关注的一些事儿
- 360浏览器无法打开Internet选项
- js学习(内置对象)
- java 开发linux常用命令
- Java - PAT - 1013. 数素数 (20) 注意超时
- BZOJ3426: Poi2013 Tower Defense Game