之前在开发的过程中,对定义类的属性用stong
还是copy
总是有一点迷惑,现在结合代码来巩固一下认知。
定一一个Person
类,类中定义两个属性,分别用stong
和copy
修饰。
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copyString;
@end
在定义一个可变字符串,分别赋值给这两个属性,然后改变可变字符串的值,看看有什么变化。
先测strong
。
Person *person = [[Person alloc] init];
NSMutableString *name = [NSMutableString stringWithFormat:@"李三"];
person.strongString = name;
NSLog(@"name没改之前person.name=%@",person.strongString);
[name setString:@"王武"];
NSLog(@"name改之后person.name=%@",person.strongString);
NSLog(@"name=%@,%p",name,&name);
从输出结果我们可以看到person.strongString
的值在name
被修改之后烨跟着修改了。根据结果知道person.strongString
和name引用同一个内存地址。
现在测copy
NSMutableString *name = [NSMutableString stringWithFormat:@"李三"];
person.cpyString = name;
NSLog(@"name没改之前person.cpyString=%@",person.cpyString);
[name setString:@"王武"];
NSLog(@"name改之后person.cpyString=%@",person.cpyString);
NSLog(@"name=%@,%p",name,&name);
输出结果是在
name
没有改变之后,person.cpyString
没有改变。所以name
和person.cpyString
没有引用同一个内存地址。
总结
- 当原字符串是
NSString
时,字符串是不可变的,不管是strong
还是copy
属性的对象,都是指向原对象。 - 当原字符串是
NSMutableString
时,strong
属性只是增加了原字符串的引用计数,而copy
属性则是对原字符串做了次深拷贝,产生一个新的对象,且copy
属性对象指向这个新的对象,且这个Copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。(总结原文地址http://blog.csdn.net/xdrt81y/article/details/63251879)