1

以下に示す例のブロックが実行されたとします。

[testBlock testPerformWithBlock:^(BOOL finished) {
    if (finished) {
       self.textField.text = @"Finished";
       NSLog(@"Edited to add an textfield update inside block");

    }
}];

ブロックが BOOL の値を返す前に、オブジェクト testBlock を含むビュー コントローラーをポップするとどうなりますか。オブジェクトは適切に割り当て解除されますか?

4

4 に答える 4

0

ブロックがメモリから解放されるまで、ブロック内のすべてが保持されます。オブジェクトtestBlockがまだ実行中testPerformWithBlockで、ブロックがまだ生きている場合、ブロック内のすべてが保持されます。

あなたはNSLogそこでやっているだけなので、何も変わりません。

ただし、これを行う場合:

if (finished) {
    [self doSomething];
}

selfは使用されており、保持されるため、ブロックを ivar のどこかに保存する場合は注意が必要です。

于 2013-02-06T11:52:36.217 に答える
0

あなたが何を求めているのか理解できません。あなたの例では、メモリ管理に問題はありません。何かを明示的に保持していない場合は、明示的に解放する必要はありません。

于 2013-02-06T18:55:56.547 に答える
-2

割り当て解除エラーは発生しません。
「testBlock」のretainCountは呼び出し後に変化しませんが、ブロックは最後まで実行される前に解放されません。
その結果、「testBlock」dealloc の有無に関係なく、プログラムは完全に実行されます。
サンプルコードは次のとおりです。

- (void)lazyFetchingImage:(void (^)(void))finishBlock {
    [[NSOperationQueue mainQueue] addOperationWithBlock:finishBlock];
}
MainVCAppDelegate *dd = [MainVCAppDelegate new];
NSLog(@"count==%i",[dd retainCount]);
[dd lazyFetchingImage:^{
    NSLog(@"22");
}];
NSLog(@"count==%i",[dd retainCount]);
[dd release];

出力は次のようになります:
count==1
count==1
22

于 2013-11-22T09:28:57.197 に答える