19

私は主に3.0をターゲットにしているiPhoneアプリを持っていますが、新しいAPIが利用可能になったときにそれを利用します。コードは次のようになります。

if (UIApplicationDidEnterBackgroundNotification != NULL) {
    [nc
        addObserver: self
        selector:    @selector(irrelevantCallbackName:)
        name:        UIApplicationDidEnterBackgroundNotification
        object:      nil];
}

さて、Appleがこれまでに言ったことすべてによれば、関連するAPIが弱くリンクされている場合、動的リンカーはに評価されるため、これは正常に機能UIApplicationDidEnterBackgroundNotificationNULLます。そうでないことを除いて。アプリケーションはコンパイルされますが、ヒットするとすぐに。if (UIApplicationDidEnterBackgroundNotification != NULL)でクラッシュしEXC_BAD_ACCESSます。

これは単に、設定する必要のあるコンパイラフラグの問題ですか?それとも私はこれを間違った方法で行っていますか?

4

2 に答える 2

38

Aaand私はそれを理解しました。関数ではないシンボル(extern const int foobarたとえば)の場合、シンボル自体ではなく、シンボルのアドレスと比較する必要があります。したがって、次のようになります。

if (&UIApplicationWillEnterForegroundNotification != NULL)
    etc;

振り返ってみると、これは明らかなことですが、その区別について言及しなかったために、私はまだ私の周りの宇宙全体を責めています。

于 2010-06-09T02:59:56.123 に答える
5

外部フレームワーク定数をチェックするときに私がしなければならなかったことは次のとおりです。

const CLLocationAccuracy * ptr = &kCLLocationAccuracyBestForNavigation;
BOOL frameworkSupports = (ptr != NULL);
if (frameworkSupports) {
    return kCLLocationAccuracyBestForNavigation;
} else {
    return kCLLocationAccuracyBest;
}

ptr 変数がないと機能しません。

于 2010-08-23T19:31:50.193 に答える