【发布时间】:2011-10-26 21:44:06
【问题描述】:
我正在开发一个 iPhone 应用程序,我刚刚创建了这个方法(它在一个单例类中):
- (NSDictionary *)getLastPosts
{
SBJsonParser *parser = [[SBJsonParser alloc] init];
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:http://example.org/last/]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSDictionary *data_dict = [parser objectWithString:json_string error:nil];
// release stuff
[parser release];
[request release];
[response release];
[json_string release];
return data_dict;
}
我是一个新手 obj-c 开发人员,所以我不确定这两件事:
- 方法末尾的四个vars发布是否正确?
-
何时我应该发布 NSDictionary
data_dict?
更新 1
如果data_dict 是NSDictionary *data_dict = [[NSDictionary alloc] init],我应该什么时候发布它?
更新 2
在调用者中我有这个:
- (void)callerMethod
{
NSDictionary *tmpDict = [mySingleton getLastPosts];
NSLog(@"retain count: %d", [tmpDict retainCount]);
}
调试控制台打印:
retain count: 2
- 为什么“Xcode Analyze”会告诉我这几行?
- 为什么保留计数是 2?
【问题讨论】:
-
你将
data_dict返回给另一个方法,所以你不能在这个方法中释放它。你应该autorelease它,所以接收方法仍然有数据。用你用的方法,已经自动释放了。 -
如果 data_dict 是使用
[[NSDictionary alloc] init]获得的,它的保留计数为 1,您需要稍后自动释放它。如果它是通过[parser objectWithString:json_string error:nil];获得的,它已经自动释放,你应该在不自动释放的情况下返回它。 -
哦,是的,对。这是一个错误 :) 它的保留计数为 2,因为第一个所有者是单例的方法,而另一个所有者是视图控制器中的调用者?
-
我觉得
retainCount这个方法真的不能信任,静态分析器应该更值得信任。据我所知,字典是从getLastPosts返回的,保留计数为 1,但“虚拟”(我的定义)保留计数为 0,因为已经调用了 autorelease,并且在某个时候池会释放它。如果此时保留计数为 2,您应该在tmpDict上调用 retain。 -
stackoverflow.com/questions/2640568/… 解释了为什么不能依赖 retainCount。
标签: iphone objective-c ios memory-management