首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >retainCount是如何工作的?

retainCount是如何工作的?
EN

Stack Overflow用户
提问于 2012-05-31 17:09:31
回答 4查看 245关注 0票数 1

我对retainCount有个问题

代码语言:javascript
复制
NSLog(@"%i", [self.albumReceiver retainCount]);
    self.albumReceiver = [[[FacebookAlbumsDelegateReceiver alloc] init: self] autorelease];

    NSLog(@"%i", [self.albumReceiver retainCount]);

第一行的保留计数是0,但当它到达第三行时是3。self.albumReceiver上的属性是保留属性...但据我所知,它应该是2,而其他以后的保留计数应该是1,因为它是稍后自动释放的。

代码语言:javascript
复制
 NSLog(@"%i", [self.albumReceiver retainCount]);
    albumReceiver = [[[FacebookAlbumsDelegateReceiver alloc] init: self];

    NSLog(@"%i", [self.albumReceiver retainCount]);

保留计数从0开始,在这种情况下,第二个保留计数打印2...

有没有人能介绍一下这种保留和释放的工作原理……

我想如果没有'self‘关键字,它会忽略setter调用,是吗?但是如果我把自动释放放在第二个例子中,我就会出错。

EN

回答 4

Stack Overflow用户

发布于 2012-05-31 17:36:30

首先,保留计数是一个实现细节,您不应该过于关注它。你真的应该只关心所有权。

话虽如此,对你所看到的东西的解释如下:

第一行的保留计数为0

这是因为在这一点上self.albumReceivernil。在真实对象上,您永远不会看到保留计数为0(在当前的Foundation实现中)。

到达第三行时的

为3

通常情况下,保留计数应为2,分配的保留计数为+1,分配给保留属性的保留计数为+1。但是,init:方法可能会导致其他对象保留它,该属性的设置器也是如此。观察该属性的另一个对象可能也会选择保留该对象。简而言之,除非您知道所有涉及的方法的确切实现,并且您确定没有在albumReceiver上使用KVO,否则关于保留计数,您所能说的就是self拥有它的所有权(NB所有权不是独占的,其他东西也可能拥有所有权)。这就是为什么你不应该在保留计数上花太多的精力。

有人能介绍一下这种保留和释放的工作原理吗?

是。你需要从所有权的角度来考虑。某些方法会给你一个你拥有的对象。这些方法是以alloc开头的任何方法、以new开头的任何方法、以copymutableCopy开头的任何方法以及-retain。如果您以任何其他方式接收对象,则您并不拥有它。这包括接收它们作为方法的返回结果、方法的ass参数或通过方法的引用参数或作为全局或静态变量。

如果你拥有一个对象,你必须通过释放或自动释放它来放弃所有权,否则它会泄漏。如果您不拥有某个对象,则不能释放或自动释放它。

我发现最好将上面的"you“理解为”声明对象引用的作用域“。

无论如何,我建议你阅读苹果的Memory Management Rules来获得明确的解释,不要相信这里的答案。如果你看一下这个答案的原始编辑,你会发现我把规则稍微弄错了,因为自从我上次阅读它们以来,它们已经被收紧了。

票数 4
EN

Stack Overflow用户

发布于 2012-05-31 17:16:10

请勿使用retainCount。(对于适合使用它的情况,请参阅see this website。)进一步阅读:blog post by bbumprevious SO thread onethread two。另请注意,retainCount在最近的SDK中已弃用。注意弃用警告是个好主意,把所有警告都变成错误是更好的主意。

票数 2
EN

Stack Overflow用户

发布于 2012-05-31 17:22:23

在Objective-C中关注对象的retainCount通常不是一个好主意,因为通常不可能知道框架的哪些秘密部分需要保留该对象。

在你提到的将对象添加到自动释放池中的情况下,自动释放池可能会保留该对象,直到刷新该池为止(在运行循环期间)。此可能解释了为什么autoreleased对象的保留计数更高。

注意上面段落中“大概”和“可能”的用法。我不知道这是否是Cocoa/Cocoa Touch框架中正在发生的事情。这就是使用retainCount的问题所在,您无法随时知道保留计数应该是多少。

如果对对象执行retain操作(或者使用包含alloccopymutableCopynew的方法名创建对象),则可以对其执行release操作。框架也可以自由地retain对象,当它们准备好的时候,它们将release它。当保留计数达到零时,它将被dealloc

更新:看过NSObject和NSAutoreleasePool的GNUStep源代码后,我上面可能的解释可能不是正在发生的事情。但是,我无法确定,因为我看不到Apple对这两个对象的实现。甚至有更多的理由不相信retainCount或它的任何推论。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10830549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档