iOS 5 公開記念! Objective-Cのメモリ管理の革命、 ARC 超入門(サンプルはgitHubに公開)

iOS5 NDA will be gone soon!

iOS 5が公開されて、Dev CenterもWe’ll be back soon になっています。

iOS5 NDA will be gone soon!
iOS5 NDA will be gone soon!

記念に、iOS 5 のプログラム面での変化、ARCを使った簡単なサンプルをGitHubに登録しましたのでご覧下さい。

追記:うーねこ? (@ne_ko_)さんからの指摘であった、”クラス変数”という間違えた記述を、”インスタンス変数”という正しい記述に変更しました。
tomohisa/EasyBlockCallback – GitHub
ARC は、メモリ管理でこれまで手動で行っていた、

  • Retain
  • Release
  • Autorelease

を自動でコンパイラで行うようにさせる方式です。一定のルールに従う必要がありますが、メモリ管理に関する、Retain、Releaseを書かなくてよくなります。このサンプルには、ARCを使っているプロジェクトと、ARCを使っていないプロジェクトの2つが同梱されているので、書き方の違いが分かると思います。いくつか簡単に上げてみたいと思います。
このブログの以前の記事iOS 開発で、EXC_BAD_ACCESS とさよならするための6つのルール « Zero4Racer PRO Developer’s Blog を読んでいただいた方はご存知かもしれませんが、わたしは以前から、retain, releaseを書かないスタイルの書き方をしていましたが、その方式がARCによって、オフィシャルになった感じです。以前のわたしのやり方では、オブジェクト型は、必ずプロパティを作成するというものでしたが、ARCにおいては、インスタンス変数がpropertyのように作用します。

まず、サンプルコードを見てみましょう
iOS4以前の書き方
[cc lang=”ObjC”]
@interface ViewController()
@property (nonatomic, retain) IBOutlet UIButton* button;
@property (nonatomic, retain) IBOutlet UILabel* label;
@property (nonatomic, retain) EasyCallBack* easyCallback;
@end

@implementation ViewController
@synthesize button;
@synthesize label;
@synthesize easyCallback;
// dealloc の中では self.some = nil; は禁止
– (void) dealloc {
[button release];
[label release];
[easyCallback release];
}
[/cc]
ARCによる書き方
[cc lang=”ObjC”]
@implementation ViewController {
__strong EasyCallBack* easyCallback;
IBOutlet UIButton* button;
IBOutlet UILabel* label;
}
[/cc]
ここから解説を行います。

  1. @property で書いていたものが、インスタンス変数で同じような作用をするようになった。
  2. これが一番大きいですね。サンプルコードで見てみましょう。自動でコンパイラにretain, releaseしてもらうために、今までは、@propertyを記述する必要があります。ARCでは、変数を定義するだけです。これだけで、以前の@propertyを使っていたときの動きと同じ動きをして、メモリ管理を行ってくれます。
    [cc lang=”ObjC”]__strong EasyCallBack* easyCallback;[/cc]というように、[cci lang=”ObjC”]__strong[/cci]を付けることによって、以前の retain と同じような意味、つまりこのオブジェクトを所有する事を示します。
    [cci lang=”ObjC”]__weak[/cci]を使用すると、このオブジェクトを所有しない場合に使えます。これは、delegateパターンを行う時に便利ですね。

  3. @imprementation にインスタンス変数を書ける
  4. コードを見て気付いたかもしれませんが、@imprementationの中に、{} で変数を書いています。これは今まで、@interface{}でのみ許されていたものです。これによって、@interfaceは、完全に外部との連携が必要なものだけ考慮すれば良くなりました。
    [cc lang=”ObjC”]
    @implementation ViewController {
    __strong EasyCallBack* easyCallback;
    IBOutlet UIButton* button;
    IBOutlet UILabel* label;
    }
    [/cc]

  5. deallocでの自動 relase
  6. 以前の書き方では、deallocでちゃんとリリースしてあげないと、メモリリークをしていたのですが、ARCを使うと、deallocでのreleaseを自動で行ってくれます。これによって、コードはかなりシンプルになりますね。

ARCを有効にする方法

  • 新規プロジェクトの場合
  • XCodeの新規プロジェクトでは、ARCを有効にするのチェックボックスがありますね。それをチェックすればOKです。

    Xcode 新規プロジェクト作成
    Xcode 新規プロジェクト作成
    ARCをチェック
    ARCをチェック

  • 過去のプロジェクトにARCを設定するためには、ビルド設定でARCをONに出来ます。
  • ビルド設定でARCオン
    ビルド設定でARCオン

    ただし、これをすると、全部のファイルをARCに変換数必要があります。この際、下にある、Warningの中のObjective-C++ Automatic Reference Counting もオンにしておくと、警告がちゃんと出るのでいいと思います。

これを書いているところで、iOS Dev Centerに、Xcode4.2が通常版としてリリースされたようです!それでは、iOS5でのプログラミングを是非お楽しみください。

「iOS 5 公開記念! Objective-Cのメモリ管理の革命、 ARC 超入門(サンプルはgitHubに公開)」への8件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください