内部で weak を使った静的ライブラリを iOS 4 環境で使うとどうなるか : Objective-C プログラミング

PROGRAM


内部で weak を使った静的ライブラリを iOS 4 環境で使うとどうなるか

iOS 5 SDK から、ARC (Automatic Reference Counting) で weak という、オブジェクトがリリースされると自動的に nil になる変数を使えるようになりましたけど、この weak を除けば iOS 4 SDK でも ARC を利用することができるようになっています。

それなら、weak を使ったコードを含む静的ライブラリを Deployment Target = iOS 5 で作成して、それを Deployment Target が iOS 4 のプロジェクトに組み込んだらどうなるだろう、と思って試してみました。

 

ヘッダーファイルには weak が現れないようにして、ソースファイル内部だけで weak を使った静的ライブラリを Deployment Target = iOS 5.0 のプロジェクトにリンクして実行させてみたところ、リンクまではできてビルドされるものの、次のような実行時エラーが発生してしまいました。

dyld: lazy symbol binding failed: Symbol not found: _objc_storeWeak
Referenced from: /Users/tomohiro/Library/Application Support/iPhone Simulator/4.3.2/Applications/751063B2-A112-455B-93D7-A982841A0617/TestWeak.app/TestWeak
Expected in: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation

dyld: Symbol not found: _objc_storeWeak
Referenced from: /Users/tomohiro/Library/Application Support/iPhone Simulator/4.3.2/Applications/751063B2-A112-455B-93D7-A982841A0617/TestWeak.app/TestWeak

Expected in: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation

やはりランタイムでの制御がされているみたいですね。

もしかしたらビルド時に "本体に nil が代入されたら関連する weak 変数にも nil を代入する" みたいなコードが自動で埋め込まれるのかなとも期待したのですけど、やっぱりちゃんと iOS 5 以上の環境でないと使っちゃいけない様子でした。

[ もどる ]