iOS 5が公開されて、Dev CenterもWe’ll be back 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]
ここから解説を行います。
- @property で書いていたものが、インスタンス変数で同じような作用をするようになった。
- @imprementation にインスタンス変数を書ける
- deallocでの自動 relase
これが一番大きいですね。サンプルコードで見てみましょう。自動でコンパイラにretain, releaseしてもらうために、今までは、@propertyを記述する必要があります。ARCでは、変数を定義するだけです。これだけで、以前の@propertyを使っていたときの動きと同じ動きをして、メモリ管理を行ってくれます。
[cc lang=”ObjC”]__strong EasyCallBack* easyCallback;[/cc]というように、[cci lang=”ObjC”]__strong[/cci]を付けることによって、以前の retain と同じような意味、つまりこのオブジェクトを所有する事を示します。
[cci lang=”ObjC”]__weak[/cci]を使用すると、このオブジェクトを所有しない場合に使えます。これは、delegateパターンを行う時に便利ですね。
コードを見て気付いたかもしれませんが、@imprementationの中に、{} で変数を書いています。これは今まで、@interface{}でのみ許されていたものです。これによって、@interfaceは、完全に外部との連携が必要なものだけ考慮すれば良くなりました。
[cc lang=”ObjC”]
@implementation ViewController {
__strong EasyCallBack* easyCallback;
IBOutlet UIButton* button;
IBOutlet UILabel* label;
}
[/cc]
以前の書き方では、deallocでちゃんとリリースしてあげないと、メモリリークをしていたのですが、ARCを使うと、deallocでのreleaseを自動で行ってくれます。これによって、コードはかなりシンプルになりますね。
ARCを有効にする方法
- 新規プロジェクトの場合
- 過去のプロジェクトにARCを設定するためには、ビルド設定でARCをONに出来ます。
XCodeの新規プロジェクトでは、ARCを有効にするのチェックボックスがありますね。それをチェックすればOKです。
ただし、これをすると、全部のファイルをARCに変換数必要があります。この際、下にある、Warningの中のObjective-C++ Automatic Reference Counting もオンにしておくと、警告がちゃんと出るのでいいと思います。
これを書いているところで、iOS Dev Centerに、Xcode4.2が通常版としてリリースされたようです!それでは、iOS5でのプログラミングを是非お楽しみください。
「iOS 5 公開記念! Objective-Cのメモリ管理の革命、 ARC 超入門(サンプルはgitHubに公開)」への8件のフィードバック