-3

こんにちは、グローバル変数の値または設定値を取得しようとすると問題が発生します。アプリのライフサイクルのメソッドにあるコード。これapplicationDidEnterBackgroundは、呼び出しの状態をリアルタイムで知る必要がある場合に機能しますが、EXC_BAD_ACCESS が生成される場合があります

これは変数宣言@property(nonatomic, copy) NSNumber *calling;で、これは私の .h ファイルにあります。

これは私の .m 実装ファイルの私のコードです:

__unsafe_unretained typeof(self) weakSelf = self;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    @autoreleasepool
    {
        while (weakSelf.calling.intValue == 1)
        {
            callCenter.callEventHandler = ^(CTCall* call)
            {
                if([call.callState isEqualToString:CTCallStateDisconnected])
                {
                   weakSelf.calling = [[NSNumber numberWithInt:0] copy];//Error EXC_BAD_ACCESS

                }

            };
        }
    }
});

ただし、エラーが発生する場合と発生しない場合があります。何か案が?

4

1 に答える 1

4

この の 使用 を やめるweakSelf. それは必要ない。selfこのブロックは保持されません。リテインサイクルはありません。

__weak「動作しない」と言う場合self、ブロックが実行されるまでに既に割り当てが解除されている兆候であるため、弱い参照が に設定されているため、nilそれへのメッセージは何もしません。__unsafe_unretainedこれがクラッシュする理由でもあります --selfは既に割り当て解除されています。__weakに設定しないnilと、ダングリング ポインターになります。

于 2013-04-17T19:00:35.780 に答える