对象复制(二)NSCopying协议与属性copy特性示例

对象复制这事儿,在 iOS 和 macOS 开发里真挺常见的,尤其是搞数据模型、状态管理的时候。你总不改了一个地方,另一处也跟着变吧?这时候就得靠 NSCopyingcopy 特性出马了。

Demo 用的是一个叫 Chocolate 的类,场景也接地气——复制一块巧克力,还不想动原来的。听起来像开玩笑,其实挺实用。你只要让类实现 NSCopying 协议,重写 copyWithZone: 方法,记得在里面调用 copy,就能给对象做个“干净利落”的复制。

注意哦,属性如果还是用 strong 而不配合 copy,那你还是在玩共享引用。尤其是像 NSString 这类可变对象,一不小心改动,影响就不止一处。

下面这个 Chocolate 类就挺有代表性:

// Chocolate.h
@interface Chocolate : NSObject 
@property (nonatomic, strong) NSString *brand;
@property (nonatomic, strong) NSString *flavor;
@end

// Chocolate.m @implementation Chocolate - (id)copyWithZone:(NSZone *)zone { Chocolate *copy = [[Chocolate allocWithZone:zone] init]; copy.brand = [self.brand copy]; copy.flavor = [self.flavor copy]; return copy; } @end

你在代码里一用:

Chocolate *originalChocolate = [[Chocolate alloc] init];
originalChocolate.brand = @"Cadbury";
originalChocolate.flavor = @"Dark";

Chocolate *copiedChocolate = [originalChocolate copy]; copiedChocolate.brand = @"Lindt";

改副本不会动原件,爽不爽?其实这套路跟 Python 的深浅拷贝 有点像,但 Objective-C 的语法更“显式”一点,控制也更清晰。

如果你在写组件、搞状态分离,或者就是想避免那些“鬼知道是谁改了我的数据”的问题,这种复制手法还挺值得一试的。

zip 文件大小:49.85KB