[objective-c]异步请求与 NSURLConnection︰ 何时释放

标签: Objective-C
发布时间: 2017/3/27 3:36:13
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

苹果指南是非常特定的关于释放连接对象︰ 它是在 didFailWithErrorconnectionDidFinishLoading

然而,当我这样做,我后来得到这僵尸模式

*** -[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

委托类本身

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

  [receivedData release];
  Block_release(successHandler);

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

解决方法 1:

既然您已经创建与您联系

[NSURLConnection connectionWithRequest:request delegate:delegate]; 

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

说,我不会推荐它。如果你不拥有的对象,你已经不能保证它将会比 autorelease 池排水周期,即,它可能是你连接对象是 (自动) 的情况下释放完成之前加载。相反,创建保留声明用于保存连接属性︰

@property (retain) NSURLConnection *connection;

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

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

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

self.connection = nil;

至于您的代理,如果它只需要存在同时连接正在加载,你可以 autorelease 它,因为该连接保留该委托︰

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

self.connection = [NSURLConnection connectionWithRequest:request
    delegate:delegate]; 
官方微信
官方QQ群
31647020