4

OS X 10.8 マシンで Xcode 4.6 を使用してアプリを開発しています。アプリの展開ターゲットは 10.6 に設定されており、これはサポートする必要があるものです。しかし、アプリをアーカイブ (コンパイル、リンク、リソース + フレームワークの埋め込み) して 10.6 テスト マシンに展開 (コピー) すると、一般的なセグメンテーション エラーでクラッシュします。10.7で問題なく動作します。

アプリが新しいコンパイラを使用してビルドされているため、古い Mac の Xcode でプロジェクトをコンパイルできません (ARC、暗黙的なプロパティ合成、新しい Objective-C リテラル構文などを使用します)。また、ベース SDK が 10.8 であり、10.6 マシンのコンパイラが認識していない 10.8 トークンを参照しているため、型チェックも行われません。

アプリのデバッグ方法に関する提案はありますか?

4

3 に答える 3

2

私はこの会社/ソフトウェアとは一切関係ありませんが、Deploymateはアプリをスキャンして SDK の使用状況を確認し、古い OS バージョンでは利用できないセレクターや API を呼び出しているときに通知する有料アプリです。これは、API の使用に関連する例外とクラッシュを追跡するのに役立ちます。

于 2013-04-08T15:16:32.373 に答える
1

10.6 でクラッシュする 1 つ以上の 10.7+ API を使用している可能性が非常に高いです。10.8 ターゲット SDK を使用すると、その SDK で使用可能な機能へのすべての呼び出しを許可します。ただし、アプリは遅延バインドされるため、実際にこれらの関数を呼び出さなくてもクラッシュしません。これに似た明示的なチェックが必要です(フルスクリーン機能についてはこちら):

#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_6
if (runningOnLionOrLater) {
    [mainWindow setCollectionBehavior: NSWindowCollectionBehaviorFullScreenPrimary];
    [toggleFullscreenItem setHidden: NO];
}
#endif

現在のバージョンを確認する 1 つの方法は次のとおりです。

    int macVersion;
    if (Gestalt(gestaltSystemVersion, &macVersion) == noErr) {
        runningOnLionOrLater = macVersion > MAC_OS_X_VERSION_10_6;
    }

問題のある呼び出しをデバッグするには、ベース SDK を 10.6 に設定するだけで、XCode はそこで利用できない関数をマークする必要があります。

于 2013-04-08T15:15:45.163 に答える
0

これには本当に良い解決策はありませんが (macOS のバージョンごとに異なる動作を見てきました)、マシンに余裕がある場合は、古い macOS バージョンを単純にシミュレートする方法はありません。

外付け HD を使用してパーティションを作成し、さまざまな macOS バージョンをインストールすることができます。それらはすべて起動可能であり、OS バージョンごとにマシンを再起動するのは (面倒な) ことです。

于 2017-12-25T09:04:14.943 に答える