[英]__block weak is crashing when success block is initiated
我很难理解这一点:
__block __weak MyCell *weakSelf = self;
[NetworkManager profileImageForUser:id success ^(UIImage *image, NSString *userId){
weakSelf.leftImageView.image = image;
}];
问题是,当释放MyCell并启动成功块时,它崩溃,表示无法识别的选择器已发送到实例。 我该如何处理?
发生崩溃的原因是该块未保留weakSelf,这可能是在对象解除分配之后异步执行的。
为什么在这里使用__block? 这是导致您出现问题的原因。
仅当要从块内部修改有问题的对象时,才需要__block。 __block还可以防止保留对象的块的行为。 由于您没有更改weakSelf的值(仅它的属性),因此不应使用__block,这样该块将保留该对象,并在需要时将其保存在内存中,以防止发生崩溃。
您如何处理? 您可以在使用它之前检查一下weakSelf
的值以确保它不是nil
(因为您已经有效地表示您不希望保留它,但是如果释放了该对象,它将被设置为nil
):
__weak MyCell *weakSelf = self;
[NetworkManager profileImageForUser:id success ^(UIImage *image, NSString *userId){
if (weakSelf)
weakSelf.leftImageView.image = image;
}];
或者只是放弃使用weakSelf
并使用self
(它将在块完成之前为您保留):
[NetworkManager profileImageForUser:id success ^(UIImage *image, NSString *userId){
self.leftImageView.image = image;
}];
无论哪种方式,都不要使用__block
因为您不会更改对象本身,而只是更改其属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.