Objective c 这会增加保留计数:alloc还是init?
当我们需要创建一个对象并获得它的所有权时,我们会编写Objective c 这会增加保留计数:alloc还是init?,objective-c,init,retaincount,alloc,Objective C,Init,Retaincount,Alloc,当我们需要创建一个对象并获得它的所有权时,我们会编写 NSObject *someObject = [[NSObject alloc] init]; 在此之后,someObject的保留计数将等于1。哪种方法会增加计数,alloc或init,在苹果的文档中该行为是在哪里描述的?实际分配的alloc方法通常会*增加保留计数。init负责在分配后初始化对象 *在几个基础类以及第三方代码(例如,类集群)中都有例外,但在调用 OLC/手动内存管理< /p> 时,您总是负责调用发布>代码> >代码>自
NSObject *someObject = [[NSObject alloc] init];
在此之后,
someObject
的保留计数将等于1。哪种方法会增加计数,alloc
或init
,在苹果的文档中该行为是在哪里描述的?实际分配的alloc
方法通常会*增加保留计数。init
负责在分配后初始化对象
*在几个基础类以及第三方代码(例如,类集群)中都有例外,但在调用<代码> OLC/<代码>手动内存管理< /p> 时,您总是负责调用<代码>发布>代码> >代码>自动代码> >代码,这有点复杂。对于几乎所有情况,
+alloc
增加保留计数,-init
对保留计数不做任何操作
但有时,代码> > init < /C>将返回一个预先存在的对象,而不是初始化空白的一个“代码> OLC/<代码>。(
NSNumber
就是这样做的。)在这种情况下,-init
将释放self
,然后返回一个带有+1保留计数的新对象
在ARC文档中,他们说-init
是一个“使用”接收者并返回保留对象的方法。通常,这意味着init对retain计数不做任何处理。但有时,-init
实际上是在做一些保留
如果这让你感到困惑,不要担心。
正如我所说,+alloc
是做保留的那个-init
保证返回一个保留的对象,但在大多数情况下,它本身不会执行任何保留操作
在此之后,someObject的retainCounter将等于1。问题是
哪种方法增加了RETAINCUNTER alloc或init,并且在Apple中有
是否描述了此行为
“都不是”、“都不是”或“一个或另一个”都是正确答案。更好的答案是“这是一个实现细节,您需要关注一般的、不依赖于实现的规则”
首先,抛弃绝对保留计数的概念。这样想是没有用的
+alloc
返回具有+1保留计数的对象。+alloc
返回的内容必须是-release
d。实际保留计数是否为1完全是一个实现细节,对于苹果的许多类来说,它通常不是1
-init
使用消息对象的retain count并生成retain count+1(不是1,而是“加1”)的对象;从init
返回的结果必须是release
d才能正确管理
通常,init
只是调用返回self代码>而不在内部操纵保留计数。这保留了上述规则
但有时情况并非如此,这就是为什么您总是必须在初始值设定项中设置self=[super init]
(当然要检查返回值),以及为什么您永远不应该执行类似Foo*f=[Foo alloc]的操作;[f init]代码>这并不是普遍正确的。例如,NSString
的alloc
方法不分配任何内容。不分配,但在NSObject
的情况下,开发人员创建的自定义子类通常会遵循此规则NSString
通常是许多内存管理模式的例外。但不仅仅是NSString,还有许多类不遵循这种通用模式(NSNumber、UIImage等)。你的回答听起来像是对alloc
@bbum行为的明确评论。我同意这听起来像是对alloc
和init
的明确回答,我已经更新了+我也对你的答案感兴趣。