【问题标题】:What is the difference between "copy" and "retain"?“复制”和“保留”有什么区别?
【发布时间】:2011-01-24 20:43:27
【问题描述】:

copyretainNSString 有什么区别?

- (void)setString:(NSString*)newString
{
    string = [newString copy];
}

【问题讨论】:

    标签: objective-c nsstring copy retain


    【解决方案1】:

    保留和复制是两个不同的东西,第一个 在概念上是按引用调用,而第二个是按值调用。

    【讨论】:

      【解决方案2】:

      在一般情况下,保留一个对象会将其保留计数增加一。这将有助于将对象保留在内存中并防止它被吹走。这意味着,如果您只持有它的保留版本,您就可以与传递给您的任何人共享该副本。

      无论你如何复制一个对象,都应该创建另一个具有重复值的对象。将此视为克隆。您不会与传递给您的任何人共享克隆。

      尤其是在处理NSStrings 时,您可能无法假设给您NSString 的人是真的给您NSString。有人可能会给您一个子类(在这种情况下为NSMutableString),这意味着他们可能会修改幕后的值。如果您的应用程序依赖于传入的值,并且有人在您身上更改了它,那么您可能会遇到麻烦。

      【讨论】:

      • 应该提到,对于大多数不可变的Foundation 类,copy 等同于retain
      • 我可以建议“你分享那个instance给你的人”比“你分享 那个 copy 和谁传给你的”? (看来我们已经在谈论复制了)
      【解决方案3】:

      最大的不同是如果你使用copy,你要复制的对象必须实现NSCopying协议(很容易做到)。并非每个对象都实现了这一点,因此在尝试调用 copy 时,您需要小心确定您将针对哪种类型进行操作(或检查是否支持该协议)。

      我能想到的使用copy 的最佳经验法则是始终将 NSString 属性设置为“复制”而不是保留。这样,如果您搞砸并忘记释放物体所握住的绳子,您就可以从泄漏仪器中获得更准确的读数。文案的其他用途需要更仔细地考虑。

      【讨论】:

        【解决方案4】:

        copy: 创建一个作为接收者副本的新实例。这意味着您将拥有 2 个不同的

        retain: 增加接收者的retainCount。当 retainCount 为 0 时,从内存中删除一个对象(使用 dealloc)。

        【讨论】:

        • 我认为您的意思是“dealloc'ed”(动词化这个词有点尴尬),而不是“死锁”
        【解决方案5】:

        如果你使用retain,它会从原始one中复制指针值。retain也会将引用计数加一。 但是在复制的情况下,它会复制指针引用的数据并将其分配给副本的实例变量。

        【讨论】:

          【解决方案6】:

          retain :在创建的对象上完成,只是增加了引用计数。

          copy -- 它创建一个新对象,当创建新对象时,retain count 将为 1。

          希望对你有帮助...:)

          【讨论】:

            【解决方案7】:

            retain 属性被指定以便它可以保留另一个内存,即它也可以指向另一个地址 复制 首先复制地址,然后保留它。

            【讨论】:

              【解决方案8】:

              这是一个旧帖子,但这是我对这个问题的看法

              Retain 将对象的保留计数增加 1 并取得对象的所有权。

              而 copy 将复制内存位置中存在的数据并将其分配给变量,因此在复制的情况下,您首先从一个位置复制数据,将其分配给增加保留计数的变量。

              请记住,保留作品的参考和复制作品的价值

              【讨论】:

              • Retain 不复制引用。
              • copy 是否创建新对象? ,
              【解决方案9】:

              保留一个对象意味着保留计数增加一。这意味着对象的实例将保留在内存中,直到它的保留计数降至零。该属性将存储对此实例的引用,并将与保留它的任何其他人共享同一个实例。复制意味着将使用重复值克隆对象。它不与任何其他人共享。

              【讨论】:

                猜你喜欢
                • 2011-05-04
                • 2016-12-21
                • 2012-09-28
                • 2012-09-24
                • 1970-01-01
                • 2015-11-23
                • 2013-02-13
                • 2011-04-26
                • 2016-09-24
                相关资源
                最近更新 更多