面试题:copy和strong的区别是什么

91 阅读1分钟

在 iOS 开发中,使用 copystrong 定义 NSString(或其他不可变对象)属性的主要区别在于 是否拷贝对象,以及对可变对象的处理方式。

1. copy

@property (nonatomic, copy) NSString *name;
  • 作用:拷贝一份新的对象,赋值时创建一个新的不可变 NSString 实例。
  • 特点
    • 如果赋值的是 NSMutableString,它会被拷贝为不可变 NSString,避免外部修改原对象导致内部值变化。
    • 更安全,防止外部对象的修改影响当前对象。
    • 适用于 NSString 类型的属性,确保属性始终是不可变的。

2. strong

@property (nonatomic, strong) NSString *name;
  • 作用:仅仅是增加引用计数,不会拷贝对象。
  • 特点
    • 如果赋值的是 NSMutableString,它不会被拷贝,仍然指向可变对象,外部修改会影响内部。
    • 适用于对象属性不需要拷贝的情况,如 UIViewNSArray 等。

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