当在Obj-C中释放方法局部变量时

时间:2011-08-14 19:07:57

标签: iphone objective-c ios memory-management

我正在开发一个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开发人员,所以我不确定这两件事:

  • 方法结束时释放的四个变量是否正确?
  • 何时我应该发布NSDictionary data_dict

更新1

如果data_dictNSDictionary *data_dict = [[NSDictionary alloc] init],我应该将其释放?

更新2

enter image description here

在来电者中我有这个:

- (void)callerMethod
{
    NSDictionary *tmpDict = [mySingleton getLastPosts];
    NSLog(@"retain count: %d", [tmpDict retainCount]);
}

并且调试控制台打印:

retain count: 2
  • 为什么“Xcode Analyze”告诉我这些行?
  • 为什么保留计算它是2?

3 个答案:

答案 0 :(得分:6)

通常,最好释放不再需要的对象。 但要记住   - 只需要在初始化时发布allocnewcopy的内容。否则他们已经自动释放。

所以,可以释放解析器,不能发布请求,不能释放响应,可以释放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)

释放parserjson_string是正确的,因为这些是使用包含“alloc”的方法创建的。释放其他人是不正确的,因为他们是自动释放的。

您永远不必在此方法中发布data_dict,因为它是自动释放的。

请阅读Objective-C memory management rules