启动成功块时__block weak崩溃

时间:2012-08-02 00:36:37

标签: iphone objective-c ios ipad

我很难理解这一点:

__block __weak MyCell *weakSelf = self;
[NetworkManager profileImageForUser:id success ^(UIImage *image, NSString *userId){
       weakSelf.leftImageView.image = image;
}];

问题在于,当MyCell被解除分配然后启动成功块时,它会崩溃说无法识别的选择器被发送到实例。我该如何处理?

2 个答案:

答案 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,因为你没有改变对象本身,只改变它的属性。