关于此代码的引用计数的问题

Posted

技术标签:

【中文标题】关于此代码的引用计数的问题【英文标题】:Question about reference count of this code 【发布时间】:2011-05-15 12:19:16 【问题描述】:

在下面的代码中,参数的引用计数为 3(由 NSLog 显示)...我想了解原因...我试图在这里管理内存,但遇到了一些基本的误解...似乎每次在代码中引用对象时,引用计数都会增加,但是,在这种情况下,参数只被引用一次(分配除外),因此会让我相信引用计数应该只是2. 无论如何...有人可以向我解释一下为什么 arguments 的 retainCount 为 3?

NSString *authToken = [[NSDictionary dictionaryWithContentsOfFile:[GetFilePath pathForFile]] objectForKey: @"auth_token"];
NSString *apiSig = [MD5Gen returnMD5Hash:[NSString stringWithFormat:@"xxxxxxx%@", authToken]];
NSString *arguments = [[NSString alloc] initWithFormat:@"xxxxxxxx%@%@", authToken, apiSig];
NSString *encodedArguments = [arguments stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSURL *url = [[NSURL alloc] initWithString: encodedArguments];
NSLog(@"%i", [arguments retainCount]);

【问题讨论】:

【参考方案1】:

(因为戴夫要求)

不要使用 -retainCount。

对象的绝对保留计数是没有意义的。

您应该调用release 的次数与您导致对象被保留的次数完全相同。不会少(除非您喜欢泄漏),当然也不会更多(除非您喜欢崩溃)。

详情请参阅Memory Management Guidelines。


在这种特定情况下,保留计数可能会因内部实现细节而被stringByAddingPercentEscapesUsingEncoding: 增加。

除了求知欲之外,这真的无关紧要。如果你保留一个对象,你应该释放它。

【讨论】:

【参考方案2】:

retainCount 非常没用,因为它返回一个无意义的数字,几乎不应该用于调试目的。在我看来,它应该被弃用:-)

【讨论】:

@Saurabh 随时提交重复的错误...openradar.appspot.com/8122368 谢谢。这就说得通了。如何判断 API 方法是否自动发布? (dictionaryWithContentsOfFile 是我要发布的对象吗?我怎样才能找到其他方法的信息...) ambientdiscourse:在方法的名称中。请参阅@bbum 为您提供链接的文档。【参考方案3】:

你真的不应该使用retainCount - 这样做的第一个原因是许多方法返回保留+自动释放的对象,这意味着每次检索对象时它们的retainCount 会高一个(直到自动释放池耗尽)。

它对你没有用,它可能不应该是 NSObject 上的公共方法,因为它没有任何用处或功能(在 Apple 的私有 Foundation 代码之外),除了混淆试图学习 Cocoa 的初学者/Objective-C.

要了解 Obj-C 中的内存管理,请阅读 Apple 的内存管理指南:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

【讨论】:

以上是关于关于此代码的引用计数的问题的主要内容,如果未能解决你的问题,请参考以下文章

python 关于循环引用以及标记清除的问题

垃圾回收机制

关于智能指针类型shared_ptr的计数问题

关于 PHP 7 引用计数的困惑

Objective-C中的引用计数

Objective-C关于非ARC模式下的对象引用计数