关于copy和strong修饰字符串

关于copy和strong修饰字符串_第1张图片

栗子一:源字符串为NSString

@interface ViewController ()
@property (copy, nonatomic) NSString *text1;
@property (strong, nonatomic) NSString *text2;
@end

- (void)test1 {
    NSString *temp = @"this is temp string";
    NSLog(@"temp %p",temp); //0x10a23e0f8
    self.text1 = temp;
    NSLog(@"copy text1%p",self.text1);//0x10a23e0f8
    self.text2 = temp;
    NSLog(@"strong text2%p",self.text2);//0x10a23e0f8
}

上述代码声明了两个字符串属性,其中text1copy修饰,text2strong修饰,我们将一个不可变字符串的字符串分别赋值给两个属性,打印他们指向的地址都是一样:0x10a23e0f8
OK,接下来再看第二个栗子。

栗子二:源字符串为NSMutableString

(注意:NSMutableStringNSString的子类)

- (void)test2 {
    NSMutableString *temp = [[NSMutableString alloc]initWithString:@"this is tempString"];
    NSLog(@"temp指向的地址%p",temp);
    self.text1 = temp;
    NSLog(@"copy text1指向的地址%p",self.text1);
    self.text2 = temp;
    NSLog(@"strong text2指向的地址%p",self.text2);
    [temp appendString:@" lalala--->>>"];
    NSLog(@"text1 is %@ \n text2 is %@",self.text1,self.text2);
}

这个栗子将源字符串换成了NSMutableString,此时的打印结果为:

temp指向的地址0x61800026a600
copy text1指向的地址0x608000244710
strong text2指向的地址0x61800026a600
text1 is this is tempString 
text2 is this is tempString lalala--->>>

可以看到copystrong修饰的字符串所指向的地址并不一样,重新生成了一个新对象,即copy修饰的字符串对temp对象进行了深拷贝。
因而,当我们改变temp对象的值时,用strong修饰的text2也随之改变了。

小结

由上述可以看到出来,其实声明字符串属性时是用copy还是strong来修饰,取决于具体情况。但是,我还是推荐用copy来修饰,这样可以避免出现问题,同时保证程序的封装性。

你可能感兴趣的:(关于copy和strong修饰字符串)