什么时候使用Strong与copy一直分不清,其实这个和浅拷贝和深拷贝有关系。参考:参考,文章中有一点不足,稍后会做补充。
当对NSString进行strong 与copy 时,会有什么不同呢:
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,strong)NSString *strongString;
@property(nonatomic,copy)NSString *copyedString;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self test];
}
-(void)test{
NSString *string =[NSString stringWithFormat:@"abcshshsrhjrshsrjhsrhjs"];
self.strongString = string;
self.copyedString = string;
NSLog(@"%lu",[string retainCount]);
NSLog(@"orign string:%p,%p",string,&string);
NSLog(@"strong string:%p,%p",_strongString,&_strongString);
NSLog(@"copy string:%p,%p",_copyedString,&_copyedString);
}
打印截图如下:
Nsstring.png
可以很直观的看到,引用计数为3 ,strong和copy后指针指向的地址是相同的,所以说对NSString进行操作时,strong与copy都是对字符串进行了浅拷贝,只是拷贝了指针指向。(补充下参考文章中没有指明的一点,亲测, 当format后面的字符串长度大于等于12时, 引用计数为1. 这个现象存在于initWithFormat:和stringWithFormat:方法, 至于有没有其他方法也会有这种情况不敢确定,当只有很少的字符时,引用计数为-1,有兴趣的可以测试下,只是对文章中进行补充)
对不可变字符串进行strong与copy时会有什么不同呢
修改一行代码:
NSMutableString *string =[NSMutableString stringWithFormat:@"agagagagagagaegagaga"];
self.strongString = string;
self.copyedString = string;
NSLog(@"%lu",[string retainCount]);
NSLog(@"%lu",[_strongString retainCount]);
NSLog(@"%lu",[_copyedString retainCount]);
NSLog(@"orign string:%p,%p",string,&string);
NSLog(@"strong string:%p,%p",_strongString,&_strongString);
NSLog(@"copy string:%p,%p",_copyedString,&_copyedString);
MustableStiring2.png
可以很明显的看到string 与_strongString的引用计数为2,_copyString的引用计数为1,string 与_strongString的地址是相同的,而_copyString指向的新的地址,所以对于可变字符串,strong使用了浅拷贝,copy使用了深拷贝
网友评论