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