跳到主要内容

如何Object-C让自己的类用 copy 修饰符?

参考答案:

在Objective-C中,要让自己的类支持copy修饰符,你需要遵循NSCopying协议并实现其copyWithZone:方法。copy修饰符用于创建一个对象的副本,通常用于不可变对象,如字符串或数组。

以下是如何让自己的类支持copy的步骤:

  1. 声明遵循NSCopying协议: 在你的类的接口声明中,添加<NSCopying>来表示你的类遵循NSCopying协议。
@interface YourClass : NSObject <NSCopying>
// ... 类的其他声明 ...
@end
  1. 实现copyWithZone:方法: 在类的实现文件中,实现copyWithZone:方法。这个方法应该返回一个新的对象,该对象是原始对象的深拷贝或浅拷贝,具体取决于你的需求。
@implementation YourClass

- (id)copyWithZone:(NSZone *)zone {
    YourClass *copy = [[[self class] allocWithZone:zone] init];
    // 复制属性到copy对象
    copy.property1 = [self.property1 copy]; // 如果property1也遵循NSCopying协议
    copy.property2 = self.property2; // 假设property2是一个基本数据类型或不可变对象
    // ... 复制其他属性 ...
    return copy;
}

@end
  1. 使用copy修饰符: 现在,当你创建一个YourClass的对象时,你可以使用copy修饰符来创建一个该对象的副本。
YourClass *originalObject = [[YourClass alloc] init];
// ... 设置originalObject的属性 ...

YourClass *copiedObject = [originalObject copy];

注意:

  • 如果你的类包含其他遵循NSCopying协议的对象作为属性,那么在copyWithZone:方法中,你也应该对这些属性调用copy方法。
  • 对于不可变对象,如NSStringNSArray等,通常使用copy来确保你得到的是一个新的、独立的对象,而不是原始对象的引用。
  • 对于可变对象(如NSMutableStringNSMutableArray等),使用copy会得到一个不可变的副本。如果你需要一个可变对象的可变副本,你应该使用mutableCopy方法,但这需要遵循NSMutableCopying协议。