2010-11-25 36 views
0

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

回答

4

(由于戴夫问它)

不要使用-retainCount。

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

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

查看Memory Management Guidelines的全部细节。


在这种特定的情况下,保留计数可能会被撞到stringByAddingPercentEscapesUsingEncoding:在内部实现细节。

除了知识的好奇之外,它并不重要。如果你保留一个对象,你应该释放它。

3

retainCount是非常没用的,因为它给出了一个毫无意义的数字,几乎从不用于调试目的。在我看来,它应该只是被:-)

+0

@Saurabh随意提交重复的错误... http://openradar.appspot.com/8122368 – 2010-11-25 05:48:04

+0

谢谢。这就说得通了。我如何知道API方法是否被自动释放? (是dictionaryWithContentsOfFile我的对象释放?以及我怎样才能找到关于其他方法以及......) – ambientdiscourse 2010-11-25 05:48:39

0

不赞成你真的不应该永远使用retainCount - 头号原因是,很多方法都返回保留+自动释放的对象,这意味着它们的retainCount会每次检索对象时更高一次(直到autorelease池已耗尽)。

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

要解决的OBJ - C的内存管理你的头,去阅读苹果的内存管理指南:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html