在 iOS 开发中,使用 copy 和 strong 定义 NSString(或其他不可变对象)属性的主要区别在于 是否拷贝对象,以及对可变对象的处理方式。
1. copy
@property (nonatomic, copy) NSString *name;
- 作用:拷贝一份新的对象,赋值时创建一个新的不可变
NSString实例。 - 特点:
- 如果赋值的是
NSMutableString,它会被拷贝为不可变NSString,避免外部修改原对象导致内部值变化。 - 更安全,防止外部对象的修改影响当前对象。
- 适用于
NSString类型的属性,确保属性始终是不可变的。
- 如果赋值的是
2. strong
@property (nonatomic, strong) NSString *name;
- 作用:仅仅是增加引用计数,不会拷贝对象。
- 特点:
- 如果赋值的是
NSMutableString,它不会被拷贝,仍然指向可变对象,外部修改会影响内部。 - 适用于对象属性不需要拷贝的情况,如
UIView、NSArray等。
- 如果赋值的是
3. 示例对比
NSMutableString *mutableStr = [NSMutableString stringWithString:@"Hello"];
MyClass *obj1 = [[MyClass alloc] init];
obj1.name = mutableStr; // copy 方式
[mutableStr appendString:@" World"];
NSLog(@"obj1.name: %@", obj1.name); // 仍然是 @"Hello",因为 copy 生成了新的不可变字符串
MyClass *obj2 = [[MyClass alloc] init];
obj2.name = mutableStr; // strong 方式
NSLog(@"obj2.name: %@", obj2.name); // @"Hello World",因为 strong 只是持有了可变字符串的引用
4. 结论
- 如果属性是
NSString类型,推荐使用copy,避免可变对象导致的不安全问题。 - 如果确认不会赋值
NSMutableString,或者明确想要持有对象,才用strong。