Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Objective-Cのpropertyのこと

Toru Furuya
February 20, 2017
32

 Objective-Cのpropertyのこと

Toru Furuya

February 20, 2017
Tweet

Transcript

  1. // MyClass.h @interface MyClass : ParentClass @property (nonatomic, readonly, copy)

    NSString *myProp; // プロパティ @end // MyClass.m @implementation MyClass { NSString *_myIvar; // インスタンス変数 // 暗黙的に定義されてる(と思う) //NSString *_myProp; // インスタンス変数以外にも setter,getter とか } @end
  2. ARCの環境 • アトミック性属性 ◦ atomic (default) ◦ nonatomic • 所有属性

    ◦ strong (default) ◦ weak ◦ copy ◦ (assign) • アクセス制御属性 ◦ readwrite (default) ◦ readonly
  3. アトミック性属性 atomic : Read と同時に別スレッドで Write が走っても Write 前後どちらかの値が取得できる ことは保証される(その仕組みのために

    nonatomic より処理は遅いから頻繁に参照される 値には使わない方が良い)。排他処理だがスレッドセーフではない。 nonatomic : Read と同時に別スレッドで Write が走ると Read 元に不完全なデータが返る可 能性がある。
  4. // MyClass.h @interface MyClass : ParentClass @property (atomic) NSString *myProp;

    // プロパティ @end // MyClass.m @implementation MyClass - (void)someFunction { // インスタンス変数に直接代入→ atomic の排他処理にならない _myProp = @“hoge”; //setter 経由で代入→ atomic の排他処理になる self.myProp = @“fuga”; } @end
  5. 排他処理だがスレッドセーフではない ??? “ 自動生成される getter と setter はそれぞれの中で排他処理が行われますが、 getter と

    setter をまたがって排他処理が行われるわけではないのです。 ” “ そのため、マルチスレッド環境ではタイミングによっては setter が呼び出される前に別の スレッドからも getter で値が参照されるという事態が起こり、不正な結果となるわけです。 ” http://ameblo.jp/tomotaken/entry-10818354164.html
  6. スレッドセーフを実現するには Objective-C でのスレッドセーフの実装方法だけで 1 回勉強会できてしまいそうなので今回 は割愛(自分が読んでないだけ mm ) • @synchronized

    による排他制御を行う • ミューテックスによる排他制御を行う • セマフォによる排他制御を行う • NSLock による排他制御を行う • NSRecursiveLock による排他制御を行う http://program.station.ez-net.jp/special/objective-c/atomic.asp
  7. 所有属性 strong : オーナーシップを持つ(参照カウントがincrementされる) weak : オーナーシップを持たない(参照カウントがincrementされない)。オブジェクトが解放 されるとnilを返す様になる。 copy :

    コピーに対してオーナーシップを持つ(setterに渡されたオブジェクトのコピーを作る ため、元のオブジェクトとは違うオブジェクトを持つ) わかりやすいブログ
  8. weak - 循環参照を防止する Parent Child @property (strong) Child *child child.parent

    = self; @property (strong) Parent *parent 解放したい 解放したい childが参照 してるから無理 parentが参照 してるから無理
  9. Parent Child @property (strong) Child *child child.parent = self; @property

    (weak) Parent *parent 解放したい 解放したい OK!!! parentが参照 してるから無理
  10. copy - サンプル // SomeModel.h @interface SomeModel : NSObject @property

    (nonatomic) NSString *string; @property (nonatomic, copy) NSString *copiedString; @end // MyClass.m @implementation MyClass - (void)someFunction { SomeModel *model = [[SomeModel alloc] init]; NSMutableString *baseString = [NSMutableString stringWithString:@"111"]; model.string = baseString; model.copiedString = baseString; [baseString appendString:@"!!!"]; NSLog(@"string : %@", con.string); //結果:111!!! NSLog(@"copied string : %@", con.copiedString); //結果:111 } @end
  11. copy - Googleのobjective-cコーディングガイド “NSString properties should always be declared with

    the copy attribute.” “This logically follows from the requirement that setters for NSStrings always must use copy instead of retain.” https://google.github.io/styleguide/objcguide.xml?showone=Properties#Properties
  12. アクセス制御属性 readwrite と readonly 特定のインスタンス変数を外部には readonly, 実装クラスからは readwrite にするとかもで きる

    // MyClass.h @interface MyClass : ParentClass @property (readonly) NSString *myProp; @end // MyClass.m @interface MyClass() @property (readwrite) NSString *myProp; @end