2012年2月
« 1月   3月 »
 12345
6789101112
13141516171819
20212223242526
272829  
2012/02/12

iOS5時代のメモリ管理 その2 ARCの設定

前回の「iOS5時代のメモリ管理 その1」に続いてメモリ管理の話。

2回目はARC(Automatic Reference Counting)対応の準備についてです。

ARCの機能を使う為の設定方法は、新規にプロジェクトを作成するか、既存のプロジェクトを変更するか、全体でARCに対応するか、部分的に使用するかで、準備が変わってきます。


■新規プロジェクトの場合

新規にXCodeでプロジェクトを作成する際は、「Use Automatic Reference Counting」という項目のチェックをONにしていれば、プロジェクト全体がARCを使う設定でプロジェクトが作成されます。

 

■既存のプロジェクトの場合

XCodeのメニューから「Edit」→「Refactor」→「Convert to Objective-C ARC…」を選択する事でプロジェクトの設定を変更してくれます。

手動で変更する場合は、以下のあたりを修正することで対応させる事ができると思います。
・main.mを以下のようにARCのautoreleasepoolを使うように修正

@autoreleasepool {

int retVal = UIApplicationMain(argc, argv, nil, nil);

return retVal;

}

 

・Build Settingsの「Base SDK」を「iOS5」に変更
・Build Settingsの「Compiler for C/C++/Objective-C」を「Apple LLVM compiler 3.0」に変更
・Build Settingsの「Apple LLVM compiler 3.0 – Language」セクションに「Objective-C Automatic Reference Counting」という項目を作って、「YES」を設定

プログラム内のretain、release、autoreleaseや、変数の定義部分については、ARCのルールに合わせて修正して行く必要があります。

 

■全体にARCを適用し、一部のソースファイルにはARCを適用しない。

全体的に適用しない設定で、一部に適用する場合は、以下のようにします。

・Build Settingsの「Apple LLVM compiler 3.0 – Language」セクションに「Objective-C Automatic Reference Counting」という項目を「YES」に設定

・Build Phasesの「Compile Sources」を開いて、ARCを適用したいソースをダブルクリックして、開いたウィンドウで「-fno-objc-arc」というコンパイラオプションを指定

※自分が試した際は、なぜかOFFにしたソースでもARCのエラーが表示されました。

 

■全体のARCはOFFにして、一部のソースファイルにはARCを適用する。

・Build Settingsの「Apple LLVM compiler 3.0 – Language」セクションに「Objective-C Automatic Reference Counting」という項目を「NO」に設定

・Build Phasesの「Compile Sources」を開いて、ARCを適用したいソースをダブルクリックして、開いたウィンドウで「-fobjc-arc」というコンパイラオプションを指定

 

以上で準備は完了です。

 

iOS5以降で動けばいいアプリを作る場合は、完全に対応した状態で作るのがいいと思いますが、retain/releaseを使っているオープンソースのライブラリを使いたいなどあれば、ソース単位でON/OFFする必要があります。

対応するソースと、対応しないソースのどちらのボリュームが多いかで、個別にONを指定するのか、個別にOFFを指定するのかを選択すると良いかと思います。

 

iOS5以前のバージョンに対応したアプリを作りたい場合にも基本使えますが、違いがある部分があるので注意が必要です。(ソースの記述でまとめる予定です。)

iOS5以前からアプリを開発していた方は、iOS4とiOS5の両方に対応したいという場合は、あえてARCを使わないで開発するという方が効率がいいかも知れません。

 

次はARCに対応したソースの書き方をまとめる予定です。

 


※iPhoneアプリ開発に関する投稿を今から始めるiPhoneアプリ開発にまとめました。

Comments are closed.