7

ブロックでweakSelfを使用する理由は理解していますが、いつでもそれほどではありません。

コードベースを ARC に変換していますが、これはブロックで多くのリテイン サイクル警告を出します。これを変更する必要があることを収集したドキュメントから:

[self.selectedAsset addToFavoritesWithCompletion:^(NSError *error) {
    self.selectedAsset.isFavorite = YES;
    [self updateIsFavoriteButton];
}];

これに:

__weak MyViewController* weakSelf = self;
[self.selectedAsset addToFavoritesWithCompletion:^(NSError *error) {
    self.selectedAsset.isFavorite = YES;
    [weakSelf updateIsFavoriteButton];
}];

コンパイラを満足させ、保持ループを回避するため。私の質問は、なぜ行を変更する必要がないのかということです:

self.selectedAsset.isFavorite = YES;

弱い自己を使用するには?メソッド呼び出しにも評価されませんか?コンパイラがこの形式の行について警告しないのはなぜですか?

[[self selectedAsset]setIsFavorite:YES];

編集: XCode 4.6 に更新したところ、この状況でコンパイラの警告が生成されるようになりました。面白いタイミング:)

4

2 に答える 2

8

私の質問は、なぜ行を変更する必要がないのかということです:

self.selectedAsset.isFavorite = YES;使用するにはweakSelf?メソッド呼び出しにも評価されませんか?コンパイラがこの形式の行について警告しないのはなぜですか?

[[self selectedAsset]setIsFavorite:YES];

はい、まさにメソッド呼び出しです。そして、それは への強い参照を引き起こしselfます。weakSelf保持したくない場合は、に変更する必要がありますself

コンパイラの警告はすべてをキャッチするわけではありません。

于 2013-01-29T19:47:58.523 に答える