iOSにおける文字列クラスおよびcopyプロトコル

2233 ワード

一、文字列の修飾子
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メソッドをカスタマイズできます.