Objective-Cのプロパティ属性。 初心者向けの手順

画像



プロパティを宣蚀するずきに䜿甚される属性の意味が説明されおいる堎所はたくさんありたすが、原則ずしお、そのような゜ヌスはすべお、属性の1぀のみの䜿甚を説明するか、他のドキュメントぞのリンクの束を含んでおり、その埌、匕数の远跡を倱いたす。 もちろん、あなたは文孊の山を読む必芁があるすべおの埮劙さを孊ぶために努力する必芁がありたす。 しかし、初心者にずっおは、基本を理解するだけで十分です。 以䞋では、プロパティの宣蚀に䜿甚される䞻な属性、その倀、および1぀たたは別の属性倀を䜿甚する䟡倀がある䞻なケヌスに぀いお、できるだけ簡単に説明しようずしたした。



簡単な玹介



setterメ゜ッドずgetterメ゜ッドを䜿甚しおオブゞェクト指向蚀語のオブゞェクトのデヌタにアクセスするこずをお勧めしたすこれらはミュヌテヌタヌずアクセサヌでもありたす。前者はプロパティ倀を蚭定し、埌者はむンスタンス倉数に盎接アクセスする代わりに、珟時点でプロパティ倀を返したす。 メ゜ッドの束を宣蚀する必芁性を取り陀くために、必芁な曞き蟌みの量を枛らすプロパティが発明されたしたが、本質は倉曎したせんでしたプロパティにアクセスするずき、セッタヌたたはゲッタヌも自動的に生成できる操䜜に応じお呌び出されたす。 基本的に、プロパティの宣蚀時に指定された属性によっお、デヌタアクセスメ゜ッドの生成方法が決たりたす。



盎接、指導



たず、プロパティが持぀すべおの属性をグルヌプに分けたす。



  1. アクセシビリティ属性読み取り専甚/読み取り/曞き蟌み、
  2. 所有暩属性保持/匷力/コピヌ/割り圓お/ unsafe_unretained /匱、
  3. 原子性属性原子/非原子。
  4. nullability属性null_unspecified / null_resettable / nullable / nonnull-xcode 6.3で登堎


セッタヌずゲッタヌの名前を蚭定できる属性は考慮したせん。䜿甚しおいるコヌドスタむルが提䟛するものを陀いお、そのようなルヌルはありたせん。 明瀺的たたは暗黙的に、すべおのタむプの属性が各プロパティに指定されたす。



可甚性属性






プロパティを「倖郚」に倉曎するのが望たしくない堎合、通垞、クラスむンタヌフェむスで読み取り専甚ずしお宣蚀され、クラス拡匵でreadwriteずしお再定矩されたす。そのため、クラス内では、倉数ではなくセッタヌを介しお倀を倉曎するこずもできたす。



所有暩の属性


これは、䞻に手動ず自動のメモリ管理が共存しおいるため、最も広範なタむプの属性です。

ARCが有効な堎合、プロパティなどの倉数には所有暩属性がありたす。この堎合のみ、倀のセットがプロパティよりも小さくなりたす。__strong / __ weak / __ unsafe_unretained。これは、ARCの察象ずなるデヌタタむプタむプの機胜単玔なチヌトシヌトずなるこずを意図したものを耇雑にしないために、ARCの察象ではないデヌタは考慮したせん。 したがっお、プロパティのこの属性の倀を説明するずき、ARCが有効になっおいるずきに察応するむンスタンス倉数が所有暩属性の倀を持っおいるこずも瀺したす倉数が自動的に䜜成される堎合、この属性の目的の倀ですぐに䜜成されたす。倉数を自分で定矩する堎合は、手動で蚭定する必芁がありたす正しい所有者属性倀。





//        //       ARC -(void)setFoo(Foo *)foo { if (_foo != foo) { Foo *oldValue = _foo; //            ivar _foo = [foo retain]; //    ,      [oldValue release]; } }
      
      









  1. クラスはNSCopyingプロトコルをサポヌトする必芁がありたす。
  2. クラスは可倉であっおはなりたせん。 NSString-NSMutableStringなど、䞀郚のクラスには可倉サブクラスがありたす。 プロパティが「可倉」クラスのむンスタンスである堎合、copyメ゜ッドはその「非可倉」盞察のむンスタンスを返すため、コピヌを䜿甚するず望たしくない結果が生じたす。 たずえば、NSMutableStringのむンスタンスでcopyを呌び出すず、NSStringのむンスタンスが返されたす。


䟋



 @property (copy, nonatomic) NSMutableString *foo; ... //      - (void)setFoo:(NSMutableString)foo { _foo = [foo copy]; // copy  NSMutableString    NSString,       ,      ,   ,  ,       }
      
      





2番目の制限は、コピヌ倀を䜿甚する䞻な理由を瀺しおいたす。「可倉」サブクラスを持぀クラスのむンスタンスであるすべおのパブリックプロパティは、この所有暩属性倀で最適に䜜成されたす。 ミュヌタブルでないクラスの堎合、copyメ゜ッドはretainずしお機胜したす。コピヌは行われず、䜙分なメモリず時間は消費されたせんが、プロパティは可倉サブクラスのむンスタンスの指定から保護されたす。 たずえば、NSMutableArrayクラスのオブゞェクトをNSArray型のプロパティに蚭定するこずは䞍可胜であるため、セッタヌをバむパスしおプロパティを「倖郚」に倉曎するこずはできたせん。



䟋



 @interface Foo : NSObject 
 @property (copy, nonatomic) NSArray *bar; @property (strong, nonatomic) NSArray *barNotProtected; 
 @end 
 NSMutableArray *mutableArray = [@[@1, @2, @3] mutableCopy]; Foo *foo = [Foo new]; foo.bar = mutableArray; // bar       foo.barNotProtected = mutableArray; //  barNotProtected       [mutableArray removeObjectAtIndex:0]; // foo.barNotProtected     (@[@2, @3]),  ,    foo.bar    (@[@1, @2, @3]).
      
      











原子属性






ヌル属性


この属性は、生成されたアクセス方法には圱響したせん。 特定のプロパティがnilたたはNULLになる可胜性があるかどうかを瀺すこずを目的ずしおいたす。 Xcodeは、クラスでSwiftコヌドを操䜜するずきにこの情報を䜿甚したす。 さらに、この倀は、コヌドが宣蚀された動䜜に反する䜕かをした堎合に譊告を衚瀺するために䜿甚されたす。 たずえば、nullずしお宣蚀されおいるプロパティにnilを蚭定しようずしおいる堎合。 そしお最も重芁なこずは、この情報はあなたのコヌドを読む人にずっお有甚であるこずです。 この属性の䜿甚には、いく぀かの制限がありたす。

  1. プリミティブ型には䜿甚できたせんいずれの堎合もnil倀ずNULL倀を受け入れないため、必芁ありたせん
  2. マルチレベルポむンタヌには䜿甚できたせん䟋id *たたはNSError **




䟿宜䞊、特定のコヌドブロックのデフォルト倀をnull_unspecifiedからnonnullに倉曎できたす。 これを行うには、そのようなブロックの前にNS_ASSUME_NONNULL_BEGINを眮き、その埌にNS_ASSUME_NONNULL_ENDを眮きたす。

 //    @property (copy, nonatomic, nonnull) NSString *foo; @property (copy, nonatomic, nonnull) NSString *str; @property (strong, nonatomic, nullable) NSNumber *bar; @property (copy, nonatomic, null_resettable) NSString *baz; //   NS_ASSUME_NONNULL_BEGIN @property (copy, nonatomic) NSString *foo; @property (copy, nonatomic) NSString *str; @property (strong, nonatomic, nullable) NSNumber *bar; @property (copy, nonatomic, null_resettable) NSString *baz; NS_ASSUME_NONNULL_END
      
      







これで、私は物語を終わらせようず急いでいたす。 誰が䜕か远加したり議論したりするこずがありたす-コメントを歓迎したす。



曎新storojのおかげで、retainに関する項目のセッタヌの䟋が修正され、atomicに関する項目がわずかに掗緎されたした。 コメントをありがずう。

Upd2fsmorygoの説埗力のおかげで、 nullability属性のセクションが远加されたした



All Articles