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

时间:2010-11-25 05:31:23

标签: cocoa memory-management

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

3 个答案:

答案 0 :(得分:4)

(自戴夫要求)

不要使用-retainCount。

对象的绝对保留计数毫无意义。

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

有关详细信息,请参阅Memory Management Guidelines


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

除了知识分子的好奇心,这无关紧要。如果你保留一个对象,你应该释放它。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

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

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