ios属性知識の整理

4244 ワード

実は基礎知識の習得はやはり重要で、何度も属性宣言に巻き込まれて少しめまいがします.いっそまとめて、ネットで他の大牛のまとめを探して参考にしました.次は本題に入ります:1.self.nameと_nameローカル変数の違いを取得する
@interface Person : NSObject

@property (nonatomic, copy) NSString* name;
@property (nonatomic, assign) NSUInteger age;

@end

@implementation Person

@synthesize name = _name;
@synthesize age = _age;

@end

上記のコードは、xcode 6以降@synthesize部分では省略できます.次は_名前とself.nameの違い.Personオブジェクトがインスタンス化されている場合、personオブジェクトがあると仮定すると、コンパイラは自動的に_を生成します.nameという変数は、nameという属性を格納するために使用されます.パス_nameは変数のnameプロパティに直接アクセスできます.そしてself.nameの本質は、インスタンスオブジェクトのプロパティを呼び出すsetterメソッドとgetterメソッドです.これによりnameプロパティにアクセスします.2.setterメソッドとgetterメソッド.プロパティ・メソッドは、簡単なネーミング・ルールを遵守します.getterの名前は属性名と同じ(例えば、属性名がdateであればgetterの名前もdate)、setterの名前は属性名にset接頭辞を付けてアルパカ命名規則を採用する(例えば、属性名がdateであればsetterの名前はsetDate).ブールタイプのプロパティは、isで始まるgetterメソッドを定義することもできます.たとえば、次のようにします.
@property (readonly, getter=isBlue) BOOL blue;

オブジェクト内のプロパティの読み取りと書き込みは、このように理解できます.対応するgetterメソッドとsetterメソッドです.オブジェクトのプロパティが決定された場合、propertyキー宣言を使用すると、対応するsetterメソッドとgetterメソッドが自動的に生成されます.もちろん、この2つの方法を書き換えることで、より多くの機能を実現することもできます.
@interface Person : NSObject
{
    NSString *_name;
    NSUInteger _age;
}

- (void)setName:(NSString*)name;
- (NSString*)name;
- (void)setAge:(NSUInteger)age;
- (NSUInteger)age;

@end

@implementation Person

- (void)setName:(NSString*)name {
//dosomething
    _name = [name copy];
}

- (NSString*)name {
    return _name;
}

- (void)setAge:(NSUInteger)age {
//dosomething
    _age = age;
}

- (NSUInteger)age {
    return _age;
}

@end

3.合成アクセス方法:@property各変数にsetterとgetterを書くのは煩雑で必要ないに違いない.このとき合成アクセスメソッドが現れます.@propertyを使用して変数を宣言すると、この2つのメソッドが自動的に生成され、必要に応じて書き換えられます.そうしないと、デフォルトの仕様名で属性にアクセスします.このように理解することができて、オブジェクトは1つの変数で、オブジェクトの変数の中にもnameとageのこのような変数があって、彼らはすべてアクセス方法を実現しなければならなくて、それでは彼らを属性に設定します.(アクセス方法を合成した).@propertyで宣言すると、デフォルトで対応するアクセスメソッドが生成されます.注意:プロパティ(property)を宣言するときは、できるだけFoundationフレームワークのデータ型を使用します.例えば、整形はNSIntegerまたはNSUIntegerで、時間間隔の浮動小数点タイプはNSTimeIntervalで、コードデータ型がより統一されています.
4.怠け者ロードとは、属性を書き換えるgetter方法であり、属性がアクセスされたり、使用されたりしたときに、ロードを行い、システムリソースアプリケーションシーンを節約することである.
@interface XMGTopicViewController ()
@property (nonatomic, strong) NSMutableArray *users;
@end

@implementation XMGTopicViewController
- (NSMutableArray *)users  //1  
{
    if (!_users) {                       //2  
        _users = [NSMutableArray array];   //3  
    }
    return _users;                  //4.  
}

//       
self.users = [LXBUsers objectArrayWithKeyValuesArray:responseObject[@"user"]];

第一部:self.usersはgetterの第2部です:書くことができません!self.usersこれもgetterであり、getterの中にgetterがあるとデッドサイクルの第3部分をもたらす:selfを使用することができる.users、これはsetterです.ここでは_usersメソッドの作成はsetterメソッドを呼び出すことはありません.setterメソッドをカスタマイズするにはselfを使用することをお勧めします.usersの方式で第4部を設定:selfを使用できない.users、これもgetterで、getterの中にgetterがあるとデッドサイクルになります.本稿の最初の点を参照して、怠け者のロードの書き方を理解することができます.
次はポイント:5.@propertyのインジケータ栗:
@property(nonatomic, readonly, strong) NSMutableArray *users;

1 nonatomic atomic:合成アクセス方法が原子操作であるかどうかを指定することは、スレッドが安全かどうかを理解できるが、iOS上でatomicを即時に使用することもスレッドが安全であるとは限らず、スレッドの安全を保証するにはロックメカニズムを使用する必要がある.ほとんどのコードのプロパティ設定でnonatomicが使用されていることがわかります.これにより、アクセス性能が向上し、iOSでロックメカニズムを使用するコストが大きく、パフォーマンスが損なわれます.要するに、nonatomicのみを使用します.2 readwrite,readonlyこのプロパティを無視すると、システムのデフォルトはreadwriteになります.setterとgetterの2つのメソッドを生成し、readonlyを指定すると、getterメソッドのみを生成し、setterメソッドはありません.このプロパティも比較的簡単です.③ポイントはassign,strong,weak,copy,unsafe_unretained,retainはまず簡単で乱暴な上結論:スカラータイプNSInteger,NSUInteger,CGFloat,NSTimeIntervalに対してassignタイプを使用する.対応する可変タイプのサブクラスがあるオブジェクトについては、NSString/SMutableString、NSArraySM/NutableArray、NSDictionary/SMutableDictionaryなど、copyを使用して修飾します.copyはblockを修飾するためにも使われています.可変タイプについては、NSMutableString、NSMutableArray、NSMutableDictionaryなどの強力な参照strongを使用して修飾されるのが一般的であり、strongを使用して修飾される必要があります.Weakは、割り当てられた値オブジェクトに弱い参照を持つことを意味し、新しい値に対して参照カウントを増加させることも、古い値の参照カウントを減少させることもありません.与えられた値は、参照カウントが0で破棄されると、weak修飾のプロパティが自動的にnilに設定され、野ポインタエラーを効果的に防止します.Weakはdelegateなどのループリファレンスを防止するシーンを修飾するのによく使われます.retainはMRCモードでstrongと同じです.いくつかの注意点:assignはNSStringを修飾するためにも使用できるが、参照カウントを計算しないため、属性がnilに設定するとweakのように自動的に破棄されないため、nilが後でselfに行く.nameアクセスすると,野ポインタエラーが発生し,プログラムがクラッシュする.