ブロックivarに見かけの参照サイクルを持つコードがあります。次のコードは、基準周期を引き起こし、にdeallocが呼び出されることはありません:__block ARCのivarブロックの自己参照サイクル
__block MyViewController *blockSelf = self;
loggedInCallback = ^(BOOL success, NSError *error){
if (success)
{
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[blockSelf.delegate loginDidFinish];
});
}
};
しかし、私はキャプチャするブロックのスコープのための私のデリゲートへの参照を保持するために、別の__block
変数を作成した場合、基準サイクルが消える:
__block id <MyViewControllerDelegate> blockDelegate = self.delegate;
loggedInCallback = ^(BOOL success, NSError *error){
if (success)
{
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[blockDelegate loginDidFinish];
});
}
};
ここで何が起こっているのかを知りたいだけです。
パーフェクトまわり、ARCで導入された変更のマイク・アッシュの記事を読んで感謝をお勧めします!質問のタイトルをよりわかりやすいように更新しました。 –
私はiOS 4.3をターゲットにしているので、代わりに '' __unsafe_unretained''を使用しなければなりませんでしたが、うまくいきました! –