Download - objective-c propertyの属性について
objective-cpropertyの属性について
@jazzsasori
ツッコミ歓迎
株式会社REVENTIVE CTO 植本 裕紀 と申します。
@jazzsasori↓
GithubFacebookLinkedinTwitter
注)ARCが前提です
まずpropertyの宣言
【文法】@property (オプション) 型 プロパティ名;
NSStringの場合、こんな感じ
@property (nonatomic, weak) NSString *string;
いや、そもそも@propertyって何じゃい。
ってか@って何じゃい。
objective-c で @ がつくものはコンパイラディレクティブ。
コンパイラディレクティブ?
↓コンパイラへ特定の命令を前処理す
るように指示するもの。
@propertyを宣言すると何が嬉しい?
@property (nonatomic, weak) NSString *string;
○ ゲッタ/セッタ/メンバ変数が作られます。 - (void)setString:(NSString *)string;- (NSString *)getString;メンバ変数 _string
propertyを.hで宣言する
ViewController.h:
@interface ViewController : UIViewController @property (nonatomic, weak) NSString *string; @end
○ 宣言するとアクセサとメンバ変数が作られ該当クラスのインスタンス変数からアクセスできます。
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を宣言して使うケースが多いです。
今日のお話
@property (オプション) 型 プロパティ名;↑
オプションのお話をします。
propertyのオプションはこんなにあるぞ
種類 オプション 説明
メソッド名指定 getter=ゲッタ名setter=セッタ名
ゲッタ/セッタメソッドの名前を明示的に指定
読み書き属性 readonly 読み取りのみ
readwrite 読み書き(デフォルト)
値の設定方法
assign 代入によって値を設定(デフォルト)
retain オブジェクトを保持して設定
unsafe_unretained assignと同じ(ARC用)
strong retainと同じ(ARC用)
weak 弱い参照(ARC用)
copy オブジェクトをコピーして設定
アトミック性 nonatomic 排他実行されない
?
説明しよう!
getter, setter
@property (setter=setValue:) int count; setterを明示しない場合、setCount: が宣言されます。self.count = 1; とした場合、setValueが呼び出されます。
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は省略可能
weak@property (weak) id obj;参照先のオブジェクトが破棄されたら自動でnilが代入される(ゼロ化 zeroing)。__weak修飾子を持った変数と同様のふるまい。オーナーシップを持たないので知らないうちに開放されてしまう。IBOutlet、delegate を扱う変数はコレがオヌヌメ。
__unsafe_unretained, assign
@property (__unsafe_unretained) id obj; @property (assign) id obj;ゼロ化 をしないweak変数。オーナーシップを持たない。不要になった時点で自前で解放する。※ iOS 4 との互換性のためのオプションなので覚える必要無いと思います。
strong
@property (strong) id obj;オーナーシップを持つ強い参照。保持の循環(retain cycle)が発生しやすいので注意。勝手に解放されると困るオブジェクトに使う。不要になった時点でdeallocで自前解放する。
copy
@property (copy) id obj;オブジェクトのコピーを保持する。strongと同様、オーナーシップを持つ強い参照。不要になった時点でdeallocで自前解放する。
nonatomic@property (nonatomic) id obj;atomicとはマルチスレッドで動作した時、排他的な動作をして、他のスレッドの干渉を受けないことを保証する事。デフォルトはatomic。atomicである必要がなければ必ずnonatomicを指定すること。atomicにした場合、排他処理のためパフォーマンスが下がります。http://d.hatena.ne.jp/masakih/20120325/1332658392
では、まとめ
まとめ• 必然性が無い限りnonatomic指定。
• strong 指定したらその足でdeallocで解放しに行こう。
• IBOutlet は weak
• delegate も weak
ご清聴ありがとうございました。