iOSにおける文字列クラスおよびcopyプロトコル
2233 ワード
一、文字列の修飾子
iOSのオブジェクトの文字列タイプの属性は、一般的に次のように宣言されます.
テスト
理想的な印刷結果
name:0 x 1004039 f 0,sc.name:0 x 515135//コンテンツのコピーname:QQQ,sc.name:QQQ name:QQQQQQQWWW,sc.name:QQQ
strong修飾で強いポインタになると、結果が印刷されます
name:0 x 100302 f 30,sc.name:0 x 100302 f 30//ポインタのコピーname:QQQ,sc.name:QQQ name:QQQQQQWWW,sc.name:QQQQWWW//sc.nameの値が変更されました.
まとめ:オブジェクトのNSStringプロパティがNSStringタイプの変数に割り当てられている場合、copyとstrongはどうでもいい(可変文字列は定数!)NSStringプロパティがNSMutablesStringタイプ変数によって割り当てられている場合は、copyで修飾する必要があります.そうでなければNSString属性の値は不正に変更されやすい.もちろん,NSString属性のsetメソッドを書き換え,セキュリティ対策をしてもよい.
二、可変文字列は定数
印刷結果:同じアドレスを指します.定数領域
2017-03-01 20:52:11.792176 StringPoint[32162:326630] string:0x676e6972747365, String:0x676e6972747365, String:0x676e6972747365,
String:0x676e6972747365
まとめ:真のNSStringタイプ文字列は定数です.また、文字列のコンテンツメモリにすでに(定数プール)がある場合は、文字列に表示される古いメモリを指し、新しいメモリを開くことはなく、メモリ領域を節約する効果があります.
クラスにはNSStringタイプの属性nameがあり、copyで修飾されています.セットメソッド(⭐10)では、NSStringタイプの変数にパラメータを入れると、nameが文字列のアドレスを指します.NSMutablesStringタイプの変数にパラメータを入力すると、nameは新しいメモリを指し、新しいメモリ上の変数は同じNSStringタイプの文字列であり、データはより安全です.
NSString、NSMutablesString対応のcopy、mutablesCopyメソッドの場合
copy
mutableCopy
NSString
入力文字列を返します
可変の新しい文字列を返します
NSMutableString
可変でない新しい文字列を返す
可変の新しい文字列を返します
定数プールに注意.
四、copyプロトコル
クラスの場合、copyメソッドとmutableCopyメソッドをカスタマイズできます.
iOSのオブジェクトの文字列タイプの属性は、一般的に次のように宣言されます.
@property (nonatomic, copy) NSString *name; // copy
テスト
NSMutableString *name = [NSMutableString stringWithFormat:@"QQQ"];
StringClass *sc = [StringClass new];
sc.name = name;
NSLog(@"name:%p, sc.name:%p", name, sc.name);
NSLog(@"name:%@, sc.name:%@", name, sc.name);
[name appendString:@"WWW"];
NSLog(@"name:%@, sc.name:%@", name, sc.name);
理想的な印刷結果
name:0 x 1004039 f 0,sc.name:0 x 515135//コンテンツのコピーname:QQQ,sc.name:QQQ name:QQQQQQQWWW,sc.name:QQQ
strong修飾で強いポインタになると、結果が印刷されます
name:0 x 100302 f 30,sc.name:0 x 100302 f 30//ポインタのコピーname:QQQ,sc.name:QQQ name:QQQQQQWWW,sc.name:QQQQWWW//sc.nameの値が変更されました.
まとめ:オブジェクトのNSStringプロパティがNSStringタイプの変数に割り当てられている場合、copyとstrongはどうでもいい(可変文字列は定数!)NSStringプロパティがNSMutablesStringタイプ変数によって割り当てられている場合は、copyで修飾する必要があります.そうでなければNSString属性の値は不正に変更されやすい.もちろん,NSString属性のsetメソッドを書き換え,セキュリティ対策をしてもよい.
二、可変文字列は定数
NSString *string = [NSString stringWithFormat:@"string"];
NSString *newString = string;
NSString *newNewString = [string copy]; //
NSString *string1 = [NSString stringWithFormat:@"string"];
NSLog(@"
string:%p,
String:%p,
String:%p,
String:%p", string, newString, newNewString, string1);
印刷結果:同じアドレスを指します.定数領域
2017-03-01 20:52:11.792176 StringPoint[32162:326630] string:0x676e6972747365, String:0x676e6972747365, String:0x676e6972747365,
String:0x676e6972747365
まとめ:真のNSStringタイプ文字列は定数です.また、文字列のコンテンツメモリにすでに(定数プール)がある場合は、文字列に表示される古いメモリを指し、新しいメモリを開くことはなく、メモリ領域を節約する効果があります.
三、NSString、NSMutablesStringのcopyプロトコル
クラスにはNSStringタイプの属性nameがあり、copyで修飾されています.セットメソッド(⭐10)では、NSStringタイプの変数にパラメータを入れると、nameが文字列のアドレスを指します.NSMutablesStringタイプの変数にパラメータを入力すると、nameは新しいメモリを指し、新しいメモリ上の変数は同じNSStringタイプの文字列であり、データはより安全です.
NSString、NSMutablesString対応のcopy、mutablesCopyメソッドの場合
copy
mutableCopy
NSString
入力文字列を返します
可変の新しい文字列を返します
NSMutableString
可変でない新しい文字列を返す
可変の新しい文字列を返します
定数プールに注意.
四、copyプロトコル
クラスの場合、copyメソッドとmutableCopyメソッドをカスタマイズできます.