什么时候我应该在objective-c中释放这些对象?

时间:2011-10-10 11:47:57

标签: objective-c object release retain dealloc

我是编程obj-c的新手。那么,什么时候我会释放定义的对象? 我是否必须发布urlRequest,响应,数据和内容?

- (NSString*)getContentFromUrl:(NSURL*)url {
    NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init];
        [urlRequest setHTTPMethod:@"GET"];
        [urlRequest setURL:url];
    NSHTTPURLResponse *response = NULL;
    NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest 
                            returningResponse:&response 
                            error:nil];
    NSString *content = NULL;
    if ([response statusCode] >= 200) {
        content = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
    }
    [content autorelease];
    return content;
}

1 个答案:

答案 0 :(得分:1)

您必须仅发布urlRequestresponsedata已经创建为自动释放的对象,content在返回之前收到自动释放消息(我建议仅使用return [content autorelease]更改最后两行)。

将对象指针初始化为nil而不是NULL也更为常见。

如果您在任何对象上调用alloccopyretainnew,并且在初始化或重新分配对象时,Cocoa有一个约定,您必须release它们除非在创建后收到autorelease消息。

您可以从代码中看到,只有urlRequestcontent变量是使用alloc方法创建的,因此它们必须[自动]发布。

更新评论

如果您将urlRequest作为实例变量,则先前启动的变量可能会影响ivar,您可能会遇到各种麻烦(例如EXC_BAD_ACCESS)。您最好为本地变量选择一个不同的名称。