[英]Weak self is getting nil inside the block but i want to use self object inside the block
我编写了一个示例代码来建立服务器连接。 请找到我在下面写的代码。
__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内部为nil所以既没有handleResponse:
也没有handleError:
方法被调用。
你能帮我解决一下这个问题吗?
提前致谢。
答案是捕获一个强有力的参考。 您无论如何都没有保留周期,除非self
具有对完成块的引用。 无论如何,当块返回时,强引用将被释放,如果你碰巧有一个,它将打破周期。
我真的很想知道,为什么人们认为每次捕获它都需要削弱自我。
正如术语“ 保留周期 ”所述,如果您引用了一个引用第一个引用的对象的对象(直接或通过许多其他引用),则只能有一个引用。
因此,如果块上下文引用self
,则当有且仅当块由self
引用时,才有引用周期。 (顺便说一句:这适用于每一个(强)参考。在Objective-C中没有任何关于self
特别之处。)你没有那个。 在你的情况下,防止保留周期是没有理由削弱self
。
然而,有些人想要削弱它,在这种情况下使self
nil
。 这是意图。 在某些情况下,这可能是一个优势:只需考虑在为其下载数据时已经消失的模型对象。 没有理由让它保持活力。
如果你不想那样,就不要削弱self
。 就这么简单。
这个想法是下载数据不应该让你的对象保持活力。 如果您的对象在下载运行时消失(例如,如果用户从屏幕切换导致下载到另一个屏幕),那么您应该忽略结果并将其丢弃,或者将其存储到文件中,但是您应该让自己变成零。
这与参考周期无关:如果你不使用weakSelf,self最终会消失,但是你不应该让它比所需的更长时间。 最糟糕的情况是,您可能会向用户显示一条错误警告,该警告已经消失了。 失败的URL请求可能需要60秒才能失败,因此用户可能已经做了一些完全不同的事情。
使用weakSelf的正确方法是将其分配给回调中的新变量strongSelf,然后检查它是否为nil。 直接使用weakSelf是不好的,因为它可以随时变为零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.