栗子一:源字符串为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
}
上述代码声明了两个字符串属性,其中text1
用copy
修饰,text2
用strong
修饰,我们将一个不可变字符串的字符串分别赋值给两个属性,打印他们指向的地址都是一样:0x10a23e0f8
。
OK,接下来再看第二个栗子。
栗子二:源字符串为NSMutableString
(注意:NSMutableString
为NSString
的子类)
- (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--->>>
可以看到copy
和strong
修饰的字符串所指向的地址并不一样,重新生成了一个新对象,即copy
修饰的字符串对temp
对象进行了深拷贝。
因而,当我们改变temp对象的值时,用strong
修饰的text2
也随之改变了。
小结
由上述可以看到出来,其实声明字符串属性时是用copy
还是strong
来修饰,取决于具体情况。但是,我还是推荐用copy
来修饰,这样可以避免出现问题,同时保证程序的封装性。