繁体   English   中英

启动成功阻止时,__ block弱正在崩溃

[英]__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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM