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 の値 (プロパティのみ) を変更していないため、__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 に答える