对象复制(二)NSCopying协议与属性copy特性示例
对象复制这事儿,在 iOS 和 macOS 开发里真挺常见的,尤其是搞数据模型、状态管理的时候。你总不改了一个地方,另一处也跟着变吧?这时候就得靠 NSCopying 和 copy 特性出马了。
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 的语法更“显式”一点,控制也更清晰。
如果你在写组件、搞状态分离,或者就是想避免那些“鬼知道是谁改了我的数据”的问题,这种复制手法还挺值得一试的。
评论区