根据Apple文档:
NSCopying 复制对象会创建一个与原始对象具有相同类和属性的新对象。当您需要对象包含的自己的数据版本时,可以复制对象。 https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/ObjectCopying.html
@property(copy) 使用copy自动发送新分配的对象a -copy消息(将创建传递的对象的副本并将该副本分配给属性。https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/ObjectCopying.html
我知道这些概念已经有很多内容。
但有人可以解释以下情况:
这两个可以互换使用
这些2需要一起使用来实现某些目标。(因为如果我们创建一个自定义类,如果我们用@property(copy)创建这样一个类的对象,系统将如何直接创建一个副本?)< / p>
答案 0 :(得分:0)
当你使用@property(copy)id xxx时;确切的代码将是这样的:
-(id)xxx {
return [_xxx copy];
}
NSCopying
是一个表示可以复制类的协议。您需要实现类的复制方法才能使其正常工作。
答案 1 :(得分:0)
我认为你误解了copy
财产。它始终使用NSCopying
行为。 NSCopying
定义了一个copy
方法,用于从现有实例创建新实例,copy
属性使用此方法保存数据,而不是保留原始实例。
要理解copy
属性的必要性,首先我们必须了解可变对象和不可变对象之间的区别。例如,让我们看一下NSMutableArray
和NSArray
。第一个是可变的,后者是不可变的。当我们在某处传递NSMutableArray
并保留它时,我们希望避免其他类改变我们的内部状态,这就是为什么我们要复制数组的当前值而不是保存原始的可变数组。 / p>
例如:
@interface A : NSObject
@property (nonatomic, strong) NSArray *array1;
@property (nonatomic, copy) NSArray *array2;
@end
NSMutableArray *array = [NSMutableArray array];
[array addObject:@"a"];
[array addObject:@"b"];
[array addObject:@"c"];
A *a = [[A alloc] init];
a.array1 = array;
a.array2 = array;
// now we have changed the contents of a.array1 but a.array2 stays the same!
[array addObject:@"d"];
一个有趣的观点是,不可变对象不会从copy
返回一个新实例,它们会返回self
,因为如果一个对象是不可变的,那么无关紧要。