copyとstrongの違い

4528 ワード

copy


オブジェクトをcopyにするには、NSCopyingプロトコルを遵守し、copyWithZoneプロトコルメソッドを実装する必要があります.

直接割り当てアドレスのテスト:

NSString *str1 = @" ";
NSString *str2 = [str1 copy];
NSLog(@"str1 %@ %p",str1,str1);
NSLog(@"str2 %@ %p",str2,str2);
str1 = @" ";
NSLog(@"str1 %@ %p",str1,str1);
NSLog(@"str2 %@ %p",str2,str2);

印刷:[0830:577327]str 1小花0 x 10 baf 43 c 0[0830:577327]str 2小花0 x 10 baf 43 c 0[0830:577327]str 1花菜0 x 10 baf 4420[0830:577327]str 2小花0 x 10 baf 43 c 0
可変文字列をcopyでコピーすると、ポインタがコピーされ、アドレスと値が同じになります.コピーされたオブジェクトの現在の値を指します.

NSString間接付与アドレスのテスト:

NSString *str = @" ";
NSLog(@"str %@ %p",str,str);
NSString *str1 = str;
NSString *str2 = [str1 copy];
NSLog(@"str1 %@ %p",str1,str1);
NSLog(@"str2 %@ %p",str2,str2);
str = @" ";
NSLog(@"str %@ %p",str,str);
NSLog(@"str1 %@ %p",str1,str1);
NSLog(@"str2 %@ %p",str2,str2);

印刷:[1322:610374]str小花0 x 10 cd 6 e 3 c 0[1322:610374]str 1小花0 x 10 cd 6 e 3 c 0[1322:610374]str 2小花0 x 10 cd 6 e 3 c 0[1322:610374]str花菜0 x 10 cd 6 e 440[1322:610374]str 1小花0 x 10 cd 6 e 3 c 0[1322:610374]str 2小花0 x 10 cd 6 e 3 c 0
strから間接的に値を割り当てると、str文字列の値を変更しても他の文字列の値には影響しません.

copyとstrong修飾の文字列アドレスをテストします。

#import 

@interface Person : NSObject
@property (nonatomic, copy) NSString *strCopy;
@property (nonatomic, strong) NSString *strStrong;

@end

1.直接値のテスト:
Person *p1 = [[Person alloc] init];
p1.strCopy = @" ";
p1.strStrong = @" ";
NSLog(@"strCopy   %@ %p",p1.strCopy,p1.strCopy);
NSLog(@"strStrong %@ %p",p1.strStrong,p1.strStrong);
// 
p1.strCopy = @" ";
p1.strStrong = @" ";
NSLog(@"strCopy   %@ %p",p1.strCopy,p1.strCopy);
NSLog(@"strStrong %@ %p",p1.strStrong,p1.strStrong);

印刷:[1472:620824]strCopy小明0 x 10 eb 9 a 460[1472:620824]strStrong王小明0 x 10 eb 9 a 480[1472:620824]strCopy小明0 x 10 eb 9 a 4 e 0[1472:620824]strStrong王大明0 x 10 eb 9 a 500
値を変更するとアドレスが変更され、1レベルのポインタが新しい値を指すことに相当します.
2.NSString間接賦課をテストする:
NSString *string = @" ";
NSLog(@"string    %@ %p",string,string);

Person *p1 = [[Person alloc] init];
p1.strCopy = string;
p1.strStrong = string;
NSLog(@"strCopy   %@ %p",p1.strCopy,p1.strCopy);
NSLog(@"strStrong %@ %p",p1.strStrong,p1.strStrong);
// 
string = @" ";
NSLog(@"string    %@ %p",string,string);
NSLog(@"strCopy   %@ %p",p1.strCopy,p1.strCopy);
NSLog(@"strStrong %@ %p",p1.strStrong,p1.strStrong);

印刷:[1807:640600]string 0 x 10 afbd 3 c 0[1807:640600]strCopy 0 x 10 afbd 3 c 0[1807:640600]strStrong 0 x 10 afbd 3 c 0[1807:640600]string愛してる0 x 102862440[1807:640600]strCopy 0 x 10 afbd 3 c 0[1807:640600]strStrong 0 x 10 afbd 3 c 0
stringを修正してもstrCopyにもstrStrongにも影響しません.
3.NSMutablesString間接賦課をテストする:
NSMutableString *string = [NSMutableString stringWithFormat:@" "];
NSLog(@"string   %@ %p",string,string);

Person *p1 = [[Person alloc] init];
p1.strCopy = string;
p1.strStrong = string;
NSLog(@"strCopy   %@ %p",p1.strCopy,p1.strCopy);
NSLog(@"strStrong %@ %p",p1.strStrong,p1.strStrong);
// 
[string appendFormat:@" "];
NSLog(@"string   %@ %p",string,string);
NSLog(@"strCopy   %@ %p",p1.strCopy,p1.strCopy);
NSLog(@"strStrong %@ %p",p1.strStrong,p1.strStrong);

印刷:[1707:634460]string明らかに0 x 6040000446090[1707:634460]strCopy明らかに0 x 6040000025880[1707:634460]strStrong明らかに0 x 6040000446090[1707:634460]string明らかにあなたを愛している0 x 6040000446090[1707:634460]strCopy明らかに0 x 60000025880[1707:634460]strStrongは明らかにあなたを愛している0 x 6040000446090
ここではcopyで修飾された文字列のアドレスが変化し,NSMutablesString文字列オブジェクトのアドレスが変化していないことからstrongで修飾された文字列が直接元のアドレスを指すことが分かった.

まとめ:

  • NSStringの文字列のオブジェクトの値が変わると、新しいメモリが開きます.NSMutablesStringの文字列のオブジェクトの値が変わると、元のアドレスになります.
  • copyがNSSting文字列をコピーする場合、コピーポインタは、浅いコピーである.CopyがNSMutablesString文字列をコピーすると、新しいオブジェクト、すなわち深いコピーが再生成されます.copy修飾の可変文字列属性タイプは常にNSMutablesStringではなくNSStringであり、コピーしたオブジェクトを可変にするにはmutablesCopyを使用します.(すべてのcopy修飾NSSting文字列は外部の影響を受けない)
  • strongは強い指向を表し、可変文字列と可変文字列の両方に対して浅いコピーしかありません.NSMutablesStringへの深いコピーは存在しません.

  • 参照先:https://wenku.baidu.com/view/fe3752e32af90242a995e50d.html http://www.cocoachina.com/ios/20150512/11805.html