1

すべて。この問題のために私は数時間頭を叩いています。私はiPhoneとiPadのプロジェクトを組み合わせたユニバーサルプロジェクトを持っています。これらのコードベースをユニバーサルプロジェクトにまとめ、多くの " #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200"チェックを行った後、プロジェクトをiPhone(OS 3.0から3.1.3)とiPadの両方のシミュレーターで実行できるようにしました。ロードする外部ライブラリのプロジェクト設定をさらに調整した後、アプリをiPhone(OS 3.1.3を実行)にロードしました。

ただし、iPadでアプリを実行すると、すぐにSIGABRTエラーが発生します。armv6とarmv7の両方のアクティブアーキテクチャを使用して、デバッグリリースで実行してみました。アプリに適切なnibファイルが設定されていることを確認し、再確認しました(ただし、このアプリはシミュレーターで正常に実行されます)。使用している外部ライブラリを調べて、同じベースSDK(3.2)、同じアーキテクチャ(Optimized(armv6 armv7))、同じターゲットデバイスファミリ(iPhone / iPad)、および同じものを持つように設定しましたiPhone OS展開ターゲット(iPhone OS 3.0)。

要約すると...私はiPhoneとiPadのシミュレーターで動作し、実際のiPhoneで動作しますが、iPadでは動作しないユニバーサルアプリを持っています。iPadではそれほど遠くありません-実行を停止する即時のSIGABRTエラーがあります。ヘルプ??

編集以下のジェイソンの提案に従って、これが私のアプリのスタックトレースです:

#0  0x30c8e0a0 in __kill ()
#1  0x30c8e096 in kill ()
#2  0x30c8e088 in raise ()
#3  0x30ca2210 in abort ()
#4  0x32944a22 in __gnu_cxx::__verbose_terminate_handler ()
#5  0x335657ca in _objc_terminate ()
#6  0x32942df4 in __cxxabiv1::__terminate ()
#7  0x32942e48 in std::terminate ()
#8  0x32942f18 in __cxa_throw ()
#9  0x335646aa in objc_exception_throw ()
#10 0x32c91c9c in -[NSException raise] ()
#11 0x32b57db2 in -[NSObject(NSKeyValueCoding) setValue:forUndefinedKey:] ()
#12 0x32b1b9da in _NSSetUsingKeyValueSetter ()
#13 0x32b1ae40 in -[NSObject(NSKeyValueCoding) setValue:forKey:] ()
#14 0x32b1adac in -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] ()
#15 0x315db6b6 in -[UIRuntimeOutletConnection connect] ()
#16 0x32c27bc6 in -[NSObject performSelector:] ()
#17 0x32c25a18 in -[NSArray makeObjectsPerformSelector:] ()
#18 0x315d5746 in -[UINib instantiateWithOptions:owner:loadingResourcesFromBundle:] ()
#19 0x315d53c0 in -[NSBundle(NSBundleAdditions) loadNibNamed:owner:options:] ()
#20 0x314d5d50 in -[UIApplication _loadMainNibFile] ()
#21 0x314d5a7e in -[UIApplication _runWithURL:payload:launchOrientation:] ()
#22 0x31521962 in -[UIApplication handleEvent:withNewEvent:] ()
#23 0x315212e0 in -[UIApplication sendEvent:] ()
#24 0x31520d2a in _UIApplicationHandleEvent ()
#25 0x30d62b32 in PurpleEventCallback ()
#26 0x32c23d9c in CFRunLoopRunSpecific ()
#27 0x32c234e0 in CFRunLoopRunInMode ()
#28 0x314d54a8 in -[UIApplication _run] ()
#29 0x314d39f2 in UIApplicationMain ()
#30 0x00002f62 in main (argc=1, argv=0x2ffff5d8)

ご覧のとおり、main.mのmain関数からは外れません。

4

3 に答える 3

2

これは、ロードされているコード内の存在しないアウトレットを指すメイン Nib ファイルにいくつかの接続があるようです。プラットフォームに一致し、ロードされるコードと同期している Nib ファイルをロードするようにしてください。

によってコード内のいくつかのアウトレットを削除する場合は#if __IPHONE_...、このアウトレットを参照しようとしている Nib ファイルがないことを確認してください。

于 2010-04-27T12:44:56.290 に答える
0

特定のクラスを処理するには、stackoverflow にある (Jarad P のソリューション)を試してください。


..." iPad プログラミング ガイドのユニバーサル アプリに関する Apple の推奨事項では、一貫性のない API を使用して複数の OS バージョン用にビルドする場合は、NSClassFromString を使用して、そこから移動する必要があります。この方法では、1 つのターゲット (サポートしている最も低い OS) であり、コード全体に次のようなものがあります。

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
   //Code for 3.2, e.g. [mplayerControllerClass alloc]
} else {
   //Code for pre-3.2 OSes
}
于 2010-06-30T19:55:27.663 に答える
0

これはおそらく問題の解決にはなりませんが、ユニバーサル バイナリを作成しようとしている場合、使用#ifは機能しません。ユニバーサル バイナリには、iPhone と iPad の両方のコードが含まれている必要があり、実行時にどのデバイスで実行されているかを次のように判断します。

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )

さらに、条件付きコンパイルは、バージョンが少なくとも 3.2 であることのみをチェックしています。iPhone OS 4.0 が両方のデバイス用にリリースされると、iPhone ビルドに含まれる iPad 専用機能のコードが得られます。

于 2010-04-27T15:56:45.763 に答える