0

ブール値を持つブロックを呼び出しています。デバッガーによると、ブール値はfalseですが、trueとして扱われているようです。これはコンパイラ/Xcodeのバグですか、それともブロックに渡されるパラメータに同様の方法でマークを付ける必要があります__blockか?

// Hovering over the |finished| parameter displays the value of finished as NO
[self.repDataSynchronizationClient synchronizeWithRepId:rep.id andCompletion:^(NSString * progressMessage, BOOL finished){
    if( finished )
    {
        [self hideLoader];    // Breakpoint set here, which I am hitting
    }
    else
    {
        [self setLoaderTitle:progressMessage];
    }
}];

これは、ブレークポイントヒットとツールチップが表示された状況のスクリーンショットです。

4

1 に答える 1

5

デバッグではなくリリース中の場合、間違っているのはブレークポイントだけである可能性が高いです。これはおそらく、最適化のようにリリースで一部のステートメントが削除され、行番号が想定されているコードと一致しなくなったためです。

NSLog代わりに、ifステートメントがステートメントで到達している句を確認してください。


別のメモで、の使用について言及していますが__block、実際には使用せず、そこで保持サイクルがあるように見えます。おそらく次のようになります。

__block id selfReference = self;
[self.repDataSynchronizationClient synchronizeWithRepId:rep.id andCompletion:^(NSString* message, BOOL finished) {
    if (finished)
    {
        [selfReference hideLoader];
    }
    else 
    {
        [selfReference setLoaderTitle:progressMessage];
    }
}];

ARCを使用する場合は、__unsafe_unretainedの代わりにを使用して__blockください。

于 2012-08-01T18:09:40.777 に答える