Ros*_*nko 4 objective-c init alloc retaincount
当我们需要创建一个对象并获得它的所有权时,我们会写
NSObject *someObject = [[NSObject alloc] init];
Run Code Online (Sandbox Code Playgroud)
之后,someObject
保留计数将等于1.哪种方法会增加计数,alloc
或者init
,在Apple的文档中,这种行为的描述是什么?
Joe*_*Joe 11
alloc
因此,实际分配的方法通常会增加保留计数.该init
负责分配后初始化的对象.
*在几个基础类和第三方代码(例如类集群)中都有例外情况,但是您总是负责在手动内存管理中调用release
/ autorelease
调用alloc
bbu*_*bum 10
之后someObject的retainCounter将等于1.问题是哪个方法增加了retainCounter alloc或init,在Apple文档中有这种行为的描述?
"无论是","两者"还是"一个或另一个"都是正确的答案.一个更好的答案是"它是一个实现细节,你需要关注一般的,非实现依赖规则".
首先,抛弃绝对保留计数的概念.想到这一点是一种无用的方式.
+alloc
返回具有+1保留计数的对象.无论返回什么,都+alloc
必须在-release
某处.实际保留计数是否为1是否完全是一个实现细节,对于Apple的许多类而言通常不是 1.
-init
使用消息对象的保留计数并生成一个保留计数+1的对象(不是1,而是"加1"); 返回的结果init
必须release
正确管理.
通常,init
只是在return self;
没有内部操作保留计数的情况下调用.这保留了上述规则.
但是,有时它并不会导致您self = [super init]
在初始化程序中始终必须拥有(当然要检查返回值)以及为什么不应该执行类似的操作Foo *f = [Foo alloc]; [f init];
.
好吧,所以它有点复杂.对于几乎所有情况,+alloc
增加保留计数,并且对保留计数-init
不执行任何操作.
但偶尔-init
会想要返回一个预先存在的对象而不是初始化alloc
通过它的空白对象.(NSNumber
例如,这样做.)在这种情况下,-init
将释放self
,然后返回具有+1保留计数的新对象.
在ARC文档中,他们说这-init
是一种"消费"其接收者并返回一个保留对象的方法.通常,这只意味着init对保留计数没有任何作用.但有时,-init
实际上是做了一些保留.
正如我所说,那+alloc
是保留的人.-init
保证返回保留的对象,但在大多数情况下本身不会保留.
归档时间: |
|
查看次数: |
2328 次 |
最近记录: |