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で修飾された文字列が直接元のアドレスを指すことが分かった.
まとめ:
参照先:https://wenku.baidu.com/view/fe3752e32af90242a995e50d.html http://www.cocoachina.com/ios/20150512/11805.html