0

我很难理解这一点:

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

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

4

2 回答 2

1

发生这种崩溃的原因是块没有保留weakSelf,这可能是在对象释放后异步执行的。

你为什么在这里使用__block?这是你的问题的原因。

__block 仅当您要从块内部修改相关对象时才需要。__block 还可以防止块保留对象的行为。由于您没有更改 weakSelf 的 VALUE (仅它的属性),因此不应使用 __block 以便块将保留对象并因此在需要时将其保存在内存中,从而防止此崩溃。

于 2012-08-02T01:05:14.247 回答
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因为您不会更改对象本身,而只是更改其属性。

于 2012-08-02T04:14:33.097 回答