内部で 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 以上の環境でないと使っちゃいけない様子でした。
[ もどる ]