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でクラッシュしないようにすることはできますか?