属性の特質を詳しく読む
4419 ワード
「プロパティ」(property)は、オブジェクト内のデータをカプセル化するObjective-Cのプロパティです.プロパティを使用すると、コンパイラは、指定したタイプの指定した名前の変数にアクセスするためのアクセス方法を自動的に書き出します.このプロシージャはコンパイラによって実行され、エディタにはこれらの合成方法のソースコードが表示されません.コンパイラはクラスに適切なインスタンス変数を自動的に追加し、プロパティ名にインスタンス変数の名前として下線を追加します.
@synthesize:プロパティpropertyを使用すると、インスタンス変数が生成されます.デフォルトは次のとおりです.インスタンス変数名をsynthesizeで変更できます.@synthesize firstName=myfirstName; @dynamic:コンパイラがアクセスメソッドとインスタンス変数を自動的に合成することを阻止するために使用できます.
原子性(atomic,nonatomic)atomic:atomic特質を備えた取得方法は、ロック機構によってその動作の原子性を確保する.2つのスレッドが同じプロパティを読み書きすると、いつでも有効なプロパティ値が表示されます.nonatomic:ロックをかけずに、あるスレッドが属性値を書き換えたときに別のスレッドが侵入し、まだ修正されていない属性値を読み出し、誤った属性値を読み出す可能性があります.一般的に私たちはnonatomicを使うだけで、原因は以下の通りです:(1).iOSでの同期ロックの使用にはコストがかかり、パフォーマンスに問題があります.(2). 属性が原子的に設定されていても「スレッドセキュリティ」は保証されません.スレッドセキュリティを実現するには、より深いロックメカニズムが必要です. 読み書き権限(readwrite,readonly)readwrite:getter/setterメソッドを持ち、synthesizeによって実装されるとコンパイラはこの2つのメソッドを自動的に生成します.readonly:getterメソッドのみがあり、synthesizeによって実装されると、コンパイラは自動的にメソッドを生成します.
assign:「設定方法」の後、NSIntager、CGFloatなどの「純量タイプ」に対する簡単な付与操作を実行する. strong:このプロパティに「所有関係」が定義されていることを示します.このプロパティに新しい値を設定すると、設定方法は新しい値を保持し、古い値を解放してから新しい値を設定します. weak:この特質は、属性が「非所有関係」を定義していることを示しています.この属性に新しい値を設定すると、設定方法は新しい値も古い値も解放されません. copy:この設定方法は、新しい値を保持するのではなく、NSString、NSDictionary、NSArrayなどのデータ型でパッケージ性を保護するためによく使用されます.
理由:属性タイプがNSString*の場合、設定方法に渡される新しい値はNSMutablesStringクラスのインスタンスを指す可能性があります.このクラスはNSStringのサブクラスで、その値を変更できる文字列を表しています.この場合、文字列をコピーしないと、属性を設定した後、文字列の値がオブジェクトに知られずに変更される可能性があります.したがって、オブジェクトの文字列値が確実に変動しないように、「可変」文字列をコピーします.アトリビュートを実装するオブジェクトが「可変」である限り、アトリビュート値を設定するときにコピーする必要があります.
getter=:取得メソッドのメソッド名を指定します.属性がBoolean型の場合、取得メソッドの前にis接頭辞を付けるには、このメソッドで指定します.次のようになります.
@property (nonatomic, getter = isOn) Bool on;
weakとstrongの違い 上のstring 2のプロパティweakをstrongまたはcopyに変更した場合、string 2はnilを指さすことはなく、印刷の結果は以下の通りである:2016-07-05 14:13:57.352 Test[1391:43333]String 2=string 1---0 x 79 ff 0 d 30 copyとstrongの違い 上からcopyもstrongも「所有関係」を実現していることがわかります.つまりretainCountに1を加えるのですが、なぜ一般的にはstrongではなくNSString、NSArray、NSDictionaryなどの属性をcopyに設定しているのでしょうか.
なぜなら、NSString、NSArray、NSDictionaryなどのクラスには、NSMutableString、NSMutableArray、NSMutableDictionaryなどの対応する可変タイプがあるからです.NSMutablesStringというクラスはNSStringクラスのサブクラスで、その値を変更できる文字列を表しています.このとき文字列をコピーしないと、属性を設定した後、文字列の値がオブジェクトが知らないうちに変更される可能性があります.
ケースは次のとおりです.
印刷結果は次のとおりです.
上記の印刷結果から、1、設定特性がcopyのstring 1であり、[mStrappendString:@de];その後は変更されずstrongに設定され、weakのプロパティが変更されました.2、strong対応の*string 3、weak対応の*string 2指向のポインタと*mStr指向のアドレスは同じで、彼らが指向しているのは*mStr同じアドレスであることを説明して、彼らの違いはカウンタに1を加えるかどうかだけ存在します.copyに対応する*string 2は、*mStrとは異なるアドレスを指し、再オープンメモリをコピーし、retainCountに1を加えたことを示しています.
1.共通キーワード
2.属性特質
3.メモリ管理の意味
理由:属性タイプがNSString*の場合、設定方法に渡される新しい値はNSMutablesStringクラスのインスタンスを指す可能性があります.このクラスはNSStringのサブクラスで、その値を変更できる文字列を表しています.この場合、文字列をコピーしないと、属性を設定した後、文字列の値がオブジェクトに知られずに変更される可能性があります.したがって、オブジェクトの文字列値が確実に変動しないように、「可変」文字列をコピーします.アトリビュートを実装するオブジェクトが「可変」である限り、アトリビュート値を設定するときにコピーする必要があります.
4.メソッド名
getter=:取得メソッドのメソッド名を指定します.属性がBoolean型の場合、取得メソッドの前にis接頭辞を付けるには、このメソッドで指定します.次のようになります.
@property (nonatomic, getter = isOn) Bool on;
ケース・ノート
//copy, , retain,retainCount 1
@property (nonatomic, copy) NSString *string1;
//weak, assign ,retainCount 1
// , nil, 。
@property (nonatomic, weak) NSString *string2;
//string1 “string 1” ,retainCount=1
self.string1 = [[NSString alloc] initWithUTF8String:"string 1"];
//string2 “string 1” , ,retainCount
self.string2 = self.string1;
// string1 nil, string1 , “string 1” retainCount=0,
self.string1 = nil;
//weak string2 nil
NSLog(@"String 2 = %@---%p", self.string2,self.string2);
// :2016-07-05 13:55:27.400 Test[1328:34343] String 2 = (null)---0x0
なぜなら、NSString、NSArray、NSDictionaryなどのクラスには、NSMutableString、NSMutableArray、NSMutableDictionaryなどの対応する可変タイプがあるからです.NSMutablesStringというクラスはNSStringクラスのサブクラスで、その値を変更できる文字列を表しています.このとき文字列をコピーしないと、属性を設定した後、文字列の値がオブジェクトが知らないうちに変更される可能性があります.
ケースは次のとおりです.
@property (nonatomic, copy) NSString *string1;
@property (nonatomic, strong) NSString *string3;
@property (nonatomic, weak) NSString *string2;
NSMutableString *mStr = [NSMutableString stringWithFormat:@"abc"];
self.string1 = mStr;
self.string2 = mStr;
self.string3 = mStr;
[mStr appendString:@"de"];
NSLog(@"mStr:%@---%p---%p", mStr,mStr,&mStr);
NSLog(@"copyStr:%@---%p---%p", self.string1,self.string1, &_string1);
NSLog(@"strongStr:%@---%p---%p", self.string3,self.string3, &_string3);
NSLog(@"weakStr:%@---%p---%p", self.string2,self.string2, &_string2);
印刷結果は次のとおりです.
2016-07-05 14:23:32.886 Test[1458:51397] mStr:abcde---0x7a67eaf0---0xbff2201c
2016-07-05 14:23:32.886 Test[1458:51397] copyStr:abc---0x7a67e410---0x7b06587c
2016-07-05 14:23:32.886 Test[1458:51397] weakStr:abcde---0x7a67eaf0---0x7b065880
2016-07-05 14:23:32.886 Test[1458:51397] strongStr:abcde---0x7a67eaf0---0x7b065884
上記の印刷結果から、1、設定特性がcopyのstring 1であり、[mStrappendString:@de];その後は変更されずstrongに設定され、weakのプロパティが変更されました.2、strong対応の*string 3、weak対応の*string 2指向のポインタと*mStr指向のアドレスは同じで、彼らが指向しているのは*mStr同じアドレスであることを説明して、彼らの違いはカウンタに1を加えるかどうかだけ存在します.copyに対応する*string 2は、*mStrとは異なるアドレスを指し、再オープンメモリをコピーし、retainCountに1を加えたことを示しています.