0

我写了一个示例代码来建立服务器连接。请找到我在下面写的代码。弱自己越来越零,但我想在块内使用自我对象

__weak typeof(self) weakSelf = self; 
self.dataTask = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
{ 
    weakSelf.dataTask = nil; 
    NSInteger extractionResponseCode = [((NSHTTPURLResponse *)response) statusCode]; 
    if (!error && data.length > 0 && extractionResponseCode == 200) 
    { 
     [weakSelf handleResponse:data]; 
    } 
    else 
    { 
     [weakSelf handleError:error]; 
    } 
}]; 

让我要么handleResponse:handleError:基于响应调用响应后。

我已经采取weakSelf来避免ARC中的保留周期问题。

我在这里的问题是内部的块weakSelf越来越为无这样既不handleResponse:也不handleError:方法被调用。

能否请你帮我,我怎么能解决这个问题?

在此先感谢。

回答

2

答案是捕捉一个有力的参考。无论如何,你还没有保留周期,除非self提及完成块。无论如何,当该块返回时,强大的参考将会被释放,如果你碰巧有一个,这将会打破循环。

0

这个想法是,下载数据不应该让你的对象活着。如果您的对象在下载运行时消失(例如,如果用户从屏幕切换导致下载到其他屏幕),那么您应该忽略结果并将其扔掉,或者将其存储到文件中,但应该让自己变成零。

这与参考周期无关:自我最终消失如果你不使用weakSelf,但你不应该保持它的存活时间超过需要。最糟糕的情况是,你可能会向用户显示一个错误提醒,告诉用户一个早已消失的屏幕。失败的URL请求可能需要60秒才能失败,所以用户可能已经完成了一些完全不同的事情。

使用weakSelf的正确方法是将其分配给您的回调中的新变量strongSelf,然后检查它是否为零。直接使用weakSelf是不好的,因为它随时会变成零。

0

我真的不知道,为什么人们认为你需要每次weakify自你抓住它。

由于术语保留周期说,如果您有引用持有第一个引用的对象(直接或通过其他许多引用)的对象的引用,则只能有一个引用。

因此,如果块上下文引用self,那么您有参考周期,当且仅当该块由self引用时。 (顺便说一下:这适用于每一个(强)参考。Objective-C中的self并没有什么特别的地方,)没有。 防止保留周期是没有理由弱化self你的情况。

但是,有些想减弱它,使selfnil在这种情况下。这是意图。在某些情况下,这可能是一个优点:只需考虑下载数据的模型对象。没有理由让它活着。

如果你不希望出现这种情况,根本就没有weakify self。它那简单。