2011-02-06 28 views
0

Apple guide对于释放连接对象非常具体:它在didFailWithErrorconnectionDidFinishLoading中完成。带有NSURLConnection的异步请求:何时发布

然而,当我这样做,我后来在zombi模式

*** -[NSURLConnection releaseDelegate]: message sent to deallocated instance 0x1001045b0 

似乎得到这个,有一个在AppKit的一些代码,释放我的连接。

我很乐意假设苹果指南是错误的,但不想得到一些可怕的内存泄漏或引入一些细微的不兼容与旧的OSX版本或类似的东西。

在这种情况下忽略文档安全吗?

编辑
代码创建请求

URLConnectionDelegate *delegate = [[URLConnectionDelegate alloc] initWithSuccessHandler:^(NSData *response) { 
     ... 
    }]; 
    [NSURLConnection connectionWithRequest:request delegate:delegate]; 

    // I do not release delegate when testing for this issue, not sure whether I should in general 

Delegate类本身

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    successHandler(receivedData); 

    [receivedData release]; 
    Block_release(successHandler); 

    // do we really need this???????? 
    [connection release]; 
} 
+0

从文档:'NSURLConnection`在初始化时保留其委托。它会在连接完成加载,失败或取消时释放委托。'看起来您已经过度释放委托。 – 2011-02-06 02:29:49

+0

@Bavarious我不在这里发布代表。 (我是否应该是另一个问题)当我添加`[连接释放]时出现错误;`当我删除它时消失。 – 2011-02-06 02:32:21

回答

3

既然你已经创建了

[NSURLConnection connectionWithRequest:request delegate:delegate]; 

你不”的连接拥有该连接对象,因此您不应该释放它。

这就是说,我不会推荐它。如果你没有拥有一个对象,你不能保证它会超过自动释放池的消耗周期,也就是说,在连接对象完成加载之前((自动)释放)可能会出现这种情况。相反,创建一个保留声明的属性来保持连接:

@property (retain) NSURLConnection *connection; 

连接对象分配给声明的属性:

self.connection = [NSURLConnection connectionWithRequest:request 
    delegate:delegate]; 

,当连接完成加载或失败时,通过分配nil释放到声明的属性:

self.connection = nil; 

至于你的委托,如果它只需要在连接加载时存在,你可以autorelease它sinc e连接保留委托:

URLConnectionDelegate *delegate = [[[URLConnectionDelegate alloc] 
    initWithSuccessHandler:^(NSData *response) { 
    // … 
}] autorelease]; 

self.connection = [NSURLConnection connectionWithRequest:request 
    delegate:delegate];