我正在开发一个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开发人员,所以我不确定这两件事:
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
答案 0 :(得分:6)
通常,最好释放不再需要的对象。
但要记住
- 只需要在初始化时发布alloc
,new
或copy
的内容。否则他们已经自动释放。
所以,可以释放解析器,不能发布请求,不能释放响应,可以释放json_string。
答案 1 :(得分:4)
SBJsonParser *parser = [[SBJsonParser alloc] init];
您调用了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];
您调用了init,您需要将其释放。
NSDictionary *data_dict = [parser objectWithString:json_string error:nil];
返回实例,自动释放。
因此你只需要释放其中两个:
[parser release];
[json_string release];
如果NSDictionary *data_dict = [[NSDictionary alloc] init]
那么您需要自己自动释放它:约定是方法返回的任何实例都是自动释放的。
顺便说一下,通过自动释放它,你可以确保它在自动释放池被清空之前可用(除非你在它上面调用release)。
自动发布:
return [data_dict autorelease];
答案 2 :(得分:2)
释放parser
和json_string
是正确的,因为这些是使用包含“alloc”的方法创建的。释放其他人是不正确的,因为他们是自动释放的。
您永远不必在此方法中发布data_dict
,因为它是自动释放的。