我很难理解这一点:
__block __weak MyCell *weakSelf = self;
[NetworkManager profileImageForUser:id success ^(UIImage *image, NSString *userId){
weakSelf.leftImageView.image = image;
}];
问题在于,当MyCell被解除分配然后启动成功块时,它会崩溃说无法识别的选择器被发送到实例。我该如何处理?
答案 0 :(得分:1)
发生此崩溃的原因是块没有保留weakSelf,这可能是在释放对象后异步执行的。
你为什么在这里使用__block?这是导致问题的原因。
仅当您要从块内部修改有问题的对象时,才需要__块。 __block还可以防止保留对象的块的行为。由于您没有更改weakSelf的VALUE(仅限其属性),因此您不应使用__block以使该块保留该对象,从而在需要时将其保存在内存中,从而防止此崩溃。
答案 1 :(得分:0)
你是如何处理的?您可以在使用它之前检查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
,因为你没有改变对象本身,只改变它的属性。