目标C:何时使用NSCopying并使用@property(copy)?

时间:2016-05-30 07:46:40

标签: ios objective-c iphone memory-management deep-copy

根据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

我知道这些概念已经有很多内容。

但有人可以解释以下情况:

  1. 这两个可以互换使用

  2. 这些2需要一起使用来实现某些目标。(因为如果我们创建一个自定义类,如果我们用@property(copy)创建这样一个类的对象,系统将如何直接创建一个副本?)< / p>

2 个答案:

答案 0 :(得分:0)

当你使用@property(copy)id xxx时;确切的代码将是这样的:

-(id)xxx {   
  return [_xxx copy]; 
}

NSCopying是一个表示可以复制类的协议。您需要实现类的复制方法才能使其正常工作。

答案 1 :(得分:0)

我认为你误解了copy财产。它始终使用NSCopying行为。 NSCopying定义了一个copy方法,用于从现有实例创建新实例,copy属性使用此方法保存数据,而不是保留原始实例。

要理解copy属性的必要性,首先我们必须了解可变对象和不可变对象之间的区别。例如,让我们看一下NSMutableArrayNSArray。第一个是可变的,后者是不可变的。当我们在某处传递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,因为如果一个对象是不可变的,那么无关紧要。