objective-c propertyの属性について

24
objective-c propertyの属性について @jazzsasori

Upload: hiroki-uemoto

Post on 02-Jul-2015

4.119 views

Category:

Technology


5 download

DESCRIPTION

objective-c propertyの属性についてまとめました。

TRANSCRIPT

Page 1: objective-c propertyの属性について

objective-cpropertyの属性について

@jazzsasori

Page 2: objective-c propertyの属性について

ツッコミ歓迎

Page 3: objective-c propertyの属性について

株式会社REVENTIVE CTO 植本 裕紀 と申します。

@jazzsasori↓

GithubFacebookLinkedinTwitter

Page 4: objective-c propertyの属性について

注)ARCが前提です

Page 5: objective-c propertyの属性について

まずpropertyの宣言

【文法】@property (オプション) 型 プロパティ名;

NSStringの場合、こんな感じ

@property (nonatomic, weak) NSString *string;

Page 6: objective-c propertyの属性について

いや、そもそも@propertyって何じゃい。

ってか@って何じゃい。

Page 7: objective-c propertyの属性について

objective-c で @ がつくものはコンパイラディレクティブ。

コンパイラディレクティブ?

↓コンパイラへ特定の命令を前処理す

るように指示するもの。

Page 8: objective-c propertyの属性について

@propertyを宣言すると何が嬉しい?

@property (nonatomic, weak) NSString *string;

○ ゲッタ/セッタ/メンバ変数が作られます。 - (void)setString:(NSString *)string;- (NSString *)getString;メンバ変数 _string

Page 9: objective-c propertyの属性について

propertyを.hで宣言する

ViewController.h:

@interface ViewController : UIViewController @property (nonatomic, weak) NSString *string; @end

○ 宣言するとアクセサとメンバ変数が作られ該当クラスのインスタンス変数からアクセスできます。

Page 10: objective-c propertyの属性について

propertyを.mで宣言するViewController.m:

@interface ViewController ()@property (nonatomic, weak) NSString *string;@property (nonatomic, weak) IBOutlet UIView *customView; @end@implementation ViewController ~@end

○ 宣言するとアクセサとメンバ変数が作られるのは.hと同様ですが、ViewControllerをインスタンス化して扱う場合にこのpropertyにはアクセスできません。NSStringの例よりは、IBOutletなど、そのクラス内でしかアクセスする必要のないpropertyを宣言して使うケースが多いです。

Page 11: objective-c propertyの属性について

今日のお話

@property (オプション) 型 プロパティ名;↑

オプションのお話をします。

Page 12: objective-c propertyの属性について

propertyのオプションはこんなにあるぞ

種類 オプション 説明

メソッド名指定 getter=ゲッタ名setter=セッタ名

ゲッタ/セッタメソッドの名前を明示的に指定

読み書き属性 readonly 読み取りのみ

readwrite 読み書き(デフォルト)

値の設定方法

assign 代入によって値を設定(デフォルト)

retain オブジェクトを保持して設定

unsafe_unretained assignと同じ(ARC用)

strong retainと同じ(ARC用)

weak 弱い参照(ARC用)

copy オブジェクトをコピーして設定

アトミック性 nonatomic 排他実行されない

Page 13: objective-c propertyの属性について

Page 14: objective-c propertyの属性について

説明しよう!

Page 15: objective-c propertyの属性について

getter, setter

@property (setter=setValue:) int count; setterを明示しない場合、setCount: が宣言されます。self.count = 1; とした場合、setValueが呼び出されます。

Page 16: objective-c propertyの属性について

readonly@property (readonly) int count; setterが宣言されません。さらにこのままだと自分自身も書き換えできません。以下のようにして下さい。// .h @interface Hoge @property (nonatomic, readonly) id value; @end !// .m @interface Hoge () @property (nonatomic, readwrite) id value; @end※ readwriteは省略可能

Page 17: objective-c propertyの属性について

weak@property (weak) id obj;参照先のオブジェクトが破棄されたら自動でnilが代入される(ゼロ化 zeroing)。__weak修飾子を持った変数と同様のふるまい。オーナーシップを持たないので知らないうちに開放されてしまう。IBOutlet、delegate を扱う変数はコレがオヌヌメ。

Page 18: objective-c propertyの属性について

__unsafe_unretained, assign

@property (__unsafe_unretained) id obj; @property (assign) id obj;ゼロ化 をしないweak変数。オーナーシップを持たない。不要になった時点で自前で解放する。※ iOS 4 との互換性のためのオプションなので覚える必要無いと思います。

Page 19: objective-c propertyの属性について

strong

@property (strong) id obj;オーナーシップを持つ強い参照。保持の循環(retain cycle)が発生しやすいので注意。勝手に解放されると困るオブジェクトに使う。不要になった時点でdeallocで自前解放する。

Page 20: objective-c propertyの属性について

copy

@property (copy) id obj;オブジェクトのコピーを保持する。strongと同様、オーナーシップを持つ強い参照。不要になった時点でdeallocで自前解放する。

Page 21: objective-c propertyの属性について

nonatomic@property (nonatomic) id obj;atomicとはマルチスレッドで動作した時、排他的な動作をして、他のスレッドの干渉を受けないことを保証する事。デフォルトはatomic。atomicである必要がなければ必ずnonatomicを指定すること。atomicにした場合、排他処理のためパフォーマンスが下がります。http://d.hatena.ne.jp/masakih/20120325/1332658392

Page 22: objective-c propertyの属性について

では、まとめ

Page 23: objective-c propertyの属性について

まとめ• 必然性が無い限りnonatomic指定。

• strong 指定したらその足でdeallocで解放しに行こう。

• IBOutlet は weak

• delegate も weak

Page 24: objective-c propertyの属性について

ご清聴ありがとうございました。