4

dispatch_once プロジェクトを ARC に変換した後、呼び出しによって (シミュレーターで) クラッシュが発生します。

私の最初の問題はEXC_BAD_ACCESS、シングルトン オブジェクトの + (SingletonClass)shared { ... dispatch_once(..., ^{}); のいずれかで (objc_retain 呼び出しで) クラッシュしたことでした。... } メソッドは、dispatch_once 呼び出しのちょうど 1 行前に配置されます。

ログとブレークポイントに基づいて、私のコードは dispatch_once 呼び出しのブロックに実行されていません。

理由がわからなかったので、dispatch_once 呼び出しをコメントアウトしました。その呼び出しがなくても、私のアプリはクラッシュしていません。

その後、アプリが以前に呼び出したメソッドに dispatch_once を入れようとしました。それに基づいて、Xcode は、dispatch_once 呼び出しがあるメソッドに関係なく、dispatch_once 呼び出しの直前の行を指していることがわかります。

私にとって謎である主なことは、シミュレーターでアプリを実行した場合にのみ再現可能であるということです。デバイスでアプリを実行しても問題ありません。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"I will crash if you won't delete the dispatch_once after me and you run me in the iOS Simulator... If you run me on a device there won't be any problem with me...");

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        int a = 42;
    });

    return NO;
}
4

1 に答える 1

1

しばらく前にARCに変換したPhoneGapベースのプロジェクトで、まったく同じ問題と闘っていました-シミュレーターではクラッシュしますが、デバイスではクラッシュしません。

新しいプロジェクトを作成し、同じコードが正常に機能したので、プロジェクトの構成を調べて、何が違うのかを確認しました。

私の場合、古い不要なリンカ フラグが設定されていました。具体的には-weak_library /usr/lib/libSystem.B.dylib.

「ビルド設定」の「その他のリンカーフラグ」セクションからそれを削除すると、修正されました。

于 2013-03-08T21:21:18.650 に答える