问题描述:
在定义一个类的property时候,为property选择strong还是copy特别注意和研究明白的,如果property是NSString或者NSArray及其子类的时候,最好选择使用copy属性修饰。为什么呢?这是为了防止赋值给它的是可变的数据,如果可变的数据发生了变化,那么该property也会发生变化。
@property (nonatomic, strong)NSString *name
- (void)setName:(NSString *)name
{
// 不可变,内存地址始终为同一个地址,其他地方name发生改变,当前name也会跟随发生改变
[_name release];
_name = [name retain];
}
@porperty (nonatomic, copy) NSString *name
- (void)setName:(NSString *)name
{
// copy生成的对象都为不可变对象,且产生新的内存地址,其他地方name发生改变,当前name不会跟随发生改变
[_name release];
_name = [name copy];
}
// 当前name属性值是永远不可变的,所以定义NSMutableString类型是不合理的,当name进行字符串拼接或者删除的时候,程序就会崩溃。
@property (nonatomic, copy) NSMutableString *name;
// 同上,NSMutableArray MutableDictionary 不能改变内容容量大小,否则会出现程序崩溃
@property (nonatomic, copy) NSMutableArray *mutableArray;
@property (nonatomic, copy) NSMutableString *mutableString;
@property (nonatomic, copy) NSMutableDictionary *mutableDict;
总结:使用strong修复属性,会随着赋值的属性变化而变化,原因共享一块内存地址,使用copy修复属性,会产生一块新的内存地址,不会跟随外界的属性的内容变化而变化。
网友评论