在下面的代码中,参数的引用计数为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]);
答案 0 :(得分:4)
(自戴夫要求)
对象的绝对保留计数毫无意义。
您应该调用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