【问题标题】:Objective C: When to use NSCopying and and to use @property(copy)?目标 C:何时使用 NSCopying 和使用 @property(copy)?
【发布时间】:2016-09-27 23:09:50
【问题描述】:

根据 Apple 文档:

NSCopying 复制一个对象会创建一个与原始对象具有相同类和属性的新对象。当您想要对象包含的数据的您自己的版本时,您可以复制对象。 https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/ObjectCopying.html

@property(copy) 使用 copy 自动向新分配的对象发送 -copy 消息(这将创建传递对象的副本并将该副本分配给属性.https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/ObjectCopying.html

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

但是有人可以解释以下场景:

  1. 这两个可以互换使用

  2. 这两个需要一起使用才能实现。(因为如果我们创建一个自定义类,如果我们使用@property(copy)创建这样一个类的对象,系统如何直接创建一个副本)?

【问题讨论】:

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


    【解决方案1】:

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

    要了解copy属性的必要性,首先我们要了解可变对象和不可变对象之间的区别。例如,让我们看看NSMutableArrayNSArray。第一个是可变的,后者是不可变的。当我们在某处传递NSMutableArray 并保留它时,我们希望避免其他类改变我们的内部状态,这就是为什么我们要复制数组的当前值而不是保存原始可变数组的原因。

    例如:

    @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,因为如果一个对象是不可变的,那也没关系。

    【讨论】:

    • 我想你打算将 array1 和 array2 声明为可变数组,对吧?此外,在分配过程中,它应该是相反的,array = a.array1, array = a.array2;对吗?
    • @7vikram7 不,我按预期做了。问题是你可以将一个可变数组分配给一个不可变数组,然后如果你改变它,你正在改变a的内部状态。这就是复制属性的全部意义所在。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 2011-01-23
      • 2011-02-23
      • 1970-01-01
      相关资源
      最近更新 更多