3

Objective-C のブロックを理解する試みを続けています。私は次の機能を持っています:

typedef void(^TAnimation)(void);
TAnimation makeAnim(UIView *aView, CGFloat angle, CGFloat x, CGFloat y, 
                    CGFloat width, CGFloat height, UIInterfaceOrientation uiio) {
    return Block_copy(^{
        aView.transform = CGAffineTransformMakeRotation(angle);
        aView.frame = CGRectMake(x, y, width, height);
        [UIApplication sharedApplication].statusBarOrientation = uiio;
    });
}

次のことをしようとすると:

TAnimation f = makeAnim( ... );
f();

EXC_BAD_ACCESS を取得します。ただし、代わりに次のようにすると:

TAnimation f = makeAnim( ... );
[UIView animateWithDuration:0 delay:0 options:0 animations:f completion:NULL];

それは正常に動作します。最初のシナリオの問題は何ですか?

4

2 に答える 2

1

NSZombieEnabled を使用してみてください。オブジェクトの割り当てを解除すると NSZombie になるため、呼び出すと例外がスローされます。NSZombieEnabled を有効にするには、実行可能ファイルの情報ウィンドウを開き、[引数] の下に移動して、[環境に設定する変数:] の下に値を yes にして NSZombieEnable を入力します。

于 2011-07-04T14:30:25.727 に答える
0

次のような非常に単純なブロックベースの例:

#import <Foundation/Foundation.h>

typedef void(^printerBlock)(void);

printerBlock createPrinter(NSString *thingToPrint) {
    return Block_copy(^{
        NSLog(@"Printing: %@", thingToPrint);
    });
}

int main (int argc, char const* argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    printerBlock pb = createPrinter(@"Testing string.");
    pb();

    [pool drain];
    return 0;
}

これを出力します:

2011-10-22 21:28:14.316 blocker[12834:707] Printing: Testing string.

プログラムを「ブロッカー」としてコンパイルすると、直接ブロックの呼び出しが失敗する理由が他にあるはずです。いくつかの理由は、渡されたビューが過剰にリリースされていることが原因である可能性があります。その場合、NSZombieEnabled のアドバイスが役に立ちます。

ビューが過度に解放されていない場合は、これをデバッガーで実行して、どこで問題が発生しているかを正確に把握する必要があります。

実際に何が壊れているのかを突き止めるには、おそらくあなたのコードをもっと見る必要があります。

于 2011-10-23T04:32:10.917 に答える