Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

objective-c propertyの属性について

9,391 views

Published on

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

Published in: Technology
  • Be the first to comment

objective-c propertyの属性について

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

  21. 21. nonatomic @property (nonatomic) id obj;
 
 atomicとはマルチスレッドで動作した時、排他的な動作を して、他のスレッドの干渉を受けないことを保証する事。 デフォルトはatomic。
 atomicである必要がなければ必ずnonatomicを指定するこ と。atomicにした場合、排他処理のためパフォーマンスが 下がります。
 
 http://d.hatena.ne.jp/masakih/20120325/1332658392
  22. 22. では、まとめ
  23. 23. まとめ • 必然性が無い限りnonatomic指定。 • strong 指定したらその足でdeallocで解放しに 行こう。 • IBOutlet は weak • delegate も weak
  24. 24. ご清聴ありがとうございました。

×