一 共识
1 一般情况下,NSString
用copy
修饰,其他对象
用strong
修饰
@property(nonatomic, copy) NSString *name;
@property(nonatomic, strong) NSMutableArray *titles;
2 strong
与copy
修饰NSString
的影响
- 正常使用
copy
修饰NSString
@property(nonatomic, copy) NSString *name;
- (void)method
{
NSMutableString *str = [NSMutableString stringWithString:@"1"];
self.name = str;
[str appendString:@"2"];
NSLog(@"self.name = %@", self.name);
}
self.name = 1
- 使用
strong
修饰NSString
的影响
@property(nonatomic, strong) NSString *name;
- (void)method
{
NSMutableString *str = [NSMutableString stringWithString:@"1"];
self.name = str;
[str appendString:@"2"];
NSLog(@"self.name = %@", self.name);
}
self.name = 12
二 特殊情况
使用copy修饰可变对象,程序可能意外退出
@property(nonatomic, copy) NSMutableArray *titles;
- (void)method
{
self.titles = [NSMutableArray arrayWithObjects:@1, @2, nil];
//下面这条语句报错,因为self.titles实际指向的是一个NSArray对象(不可变)
[self.titles removeObjectAtIndex:0];
}
三 原理
1 copy
和strong
影响的是setter方法的实现,当使用@property
声明属性的时候,系统会根据读取权限来生成对应的setter
和getter
方法。
- strong修饰符默认的setter方法
@property(nonatomic, strong) NSString *name;
- (void)setName:(NSString *)name
{
_name = name;
}
- copy修饰符默认的setter方法
@property(nonatomic, copy) NSString *name;
- (void)setName:(NSString *)name
{
_name = [name copy];
}
2 如果重写了settter方法,则@property中的strong或者copy定义无效
下面这个例子中@property中声明的是copy,但是setter方法中用到是strong
@property(nonatomic, copy) NSString *name;
- (void)setName:(NSString *)name
{
_name = name;
}
- (void)method
{
NSMutableString *str = [NSMutableString stringWithString:@"1"];
self.name = str;
[str appendString:@"2"];
NSLog(@"self.name = %@", self.name);
}
self.name = 12