5

Apple の LLVM 4.2 コンパイラ (Base SDK 6.1) に対してコンパイルされたライブラリがあります。その中にオブジェクトの添え字があります。

私のライブラリには、1 つのメソッドを持つ 1 つのクラスしかないとします。そのメソッドはこれを行います:

NSLog(@"****** preTests");
NSDictionary *dictTest = @{ @1 : @1 };
NSLog(@"Initialized Dictionary");
NSArray *arrayTest = @[ @1, @2, @3 ];
NSLog(@"Initialized Array");
NSLog(@"****** arrayTest[1] = %@", arrayTest[1]); // First use of subscripting
NSLog(@"****** dictTest[@1] = %@", dictTest[@1]);

次に、新しいプロジェクトを作成し、このライブラリをリンクします。アプリケーション デリゲートで、このメソッドを呼び出します。このアプリケーションをGCC LLVM 4.2コンパイラでコンパイルします。コンパイルとリンクは正常に行われます。

このアプリケーションは、iOS 6 以降でエラーなく実行されます。このアプリケーションは、iOS 5 で「サブスクリプションの最初の使用」(上記) でクラッシュします。

2013-07-03 09:15:51.050 GCCTest[167:707] -[__NSArrayI objectAtIndexedSubscript:]: unrecognized selector sent to instance 0x381fb0

Apple LLVM 4.2 コンパイラでコンパイルすると、正常に実行されます。

objectAtIndexedSubscript:はiOS 6で公開されたメソッドであり、構文糖衣myArray[0]が変換されるものであると私は理解しています。

iOS 5 では Apple ではなく GCC でクラッシュが発生する理由を誰かが理解するのを手伝ってくれますか? どこかのマクロに関係していると思います...ライブラリのコードを編集せずにGCCでクラッシュしないようにすることはできますか?

4

1 に答える 1

2

"Objective-C Feature Availability Index"によると、NSArray添え字には少なくとも LLVM Compiler 4.0 が必要です。

iOS 6 以降でNSArrayは、objectAtIndexedSubscript:メソッドがあります。iOS 5 の場合、このメソッドはArclite、アプリケーションにリンクされている静的ライブラリによって提供されます (たとえば、iOS で新しい Objective-C オブジェクト リテラルを有効にする方法と、回答に示されているリンクを参照してください)。ただし、これは Clang のみの機能であり、GCC は ARC をサポートしていません。

そのため、メイン アプリケーションがコンパイルされ、GCC でリンクされている場合、配列の添え字を使用する方法がわかりません。

于 2013-07-03T17:38:36.130 に答える