Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 这会增加保留计数:alloc还是init?_Objective C_Init_Retaincount_Alloc - Fatal编程技术网

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
的明确回答,我已经更新了+我也对你的答案感兴趣。