Strong 与Copy的区别

什么时候使用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使用了深拷贝

你可能感兴趣的:(Strong 与Copy的区别)