iOS5 NDA will be gone soon!

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

このエントリーをはてなブックマークに追加
はてなブックマーク - iOS 5 公開記念! Objective-Cのメモリ管理の革命、 ARC 超入門(サンプルはgitHubに公開)

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以前の書き方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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];
}

ARCによる書き方

1
2
3
4
5
@implementation ViewController {
    __strong EasyCallBack* easyCallback;
    IBOutlet UIButton* button;
    IBOutlet UILabel* label;
}

ここから解説を行います。

  1. @property で書いていたものが、インスタンス変数で同じような作用をするようになった。
  2. これが一番大きいですね。サンプルコードで見てみましょう。自動でコンパイラにretain, releaseしてもらうために、今までは、@propertyを記述する必要があります。ARCでは、変数を定義するだけです。これだけで、以前の@propertyを使っていたときの動きと同じ動きをして、メモリ管理を行ってくれます。

    1
    __strong EasyCallBack* easyCallback;

    というように、__strongを付けることによって、以前の retain と同じような意味、つまりこのオブジェクトを所有する事を示します。
    __weakを使用すると、このオブジェクトを所有しない場合に使えます。これは、delegateパターンを行う時に便利ですね。

  3. @imprementation にインスタンス変数を書ける
  4. コードを見て気付いたかもしれませんが、@imprementationの中に、{} で変数を書いています。これは今まで、@interface{}でのみ許されていたものです。これによって、@interfaceは、完全に外部との連携が必要なものだけ考慮すれば良くなりました。

    1
    2
    3
    4
    5
    @implementation ViewController {
        __strong EasyCallBack* easyCallback;
        IBOutlet UIButton* button;
        IBOutlet UILabel* label;
    }
  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でのプログラミングを是非お楽しみください。

Comments

comments

Powered by Facebook Comments

6 comments

  1. Pingback: cohakim's blog » iOS5に追加された新機能ARC(Automatic Reference Counting)を使ってみた
  2. Pingback: iOS5: Automatic Reference Counting(ARC) « 酷叭大魔王的學習筆記
  3. Pingback: iPhoneアプリ開発 リンク集 | Linux LABS
  4. Pingback: iOS 開発で、EXC_BAD_ACCESS とさよならするための6つのルール « Zero4Racer PRO Developer's Blog
  5. Pingback: iOSプログラミング入門 – Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎読了、感想 | 東京ソフトウエア応用研究室ブログ
  6. Pingback: iOS 開発メモ (2013.3-4) | soohei.net

Post a comment

You may use the following HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>