0

我在 Objective-C 中做了一些测试,我对copy方法有疑问。有什么区别:

id object2 = [object copy];

和:

id object2 = object;

?

object = nil在此注释之后是否可见差异?那么在第一种情况下object2等于object但在第二种情况下object2等于nil?何时copy正确使用方法?

谢谢你的解释。

4

3 回答 3

3

第一种方法复制一个对象(如果它符合<NSCopying>协议)——即它创建一个逻辑上等同于旧实例的对象的新实例。这两个对象将位于内存中的不同位置。

+----------+  +---------------------------------------------+
| Object 1 |  | Copy of object 1, with identical properties |
+----------+  +---------------------------------------------+
    ^                ^
    |                |
 "object"        "object2"

第二行仅将指针分配给object变量object2- 它不会创建新实例,指针将指向完全相同的对象:

+--------+
| Object |
+--------+
   ^  ^
   |  +--------------+
"object"         "object2"

当 object = nil 时差异是否可见?

不,从那时起两个变量都将是nilnilObejctive-C 中的消息传递总是产生nil或 0)。

何时正确使用复制方法?

每当您需要复制现有对象时,例如当您想要修改其上的某些属性而不影响原始对象时。

于 2013-01-05T20:03:26.953 回答
2

不同之处在于,如果您复制对象,您将拥有一个独立的副本,并且如果您更改该对象,则原始对象不会受到影响。

例如你有一个 NSNumberFormatter:

NSNumberFormatter* f1= [NSNumberFormatter new];
f1.numberStyle= NSNUmberFormatterDecimalStyle;
NSNumberFormatter* f2= [f1 copy];
f2.numberStyle= NSNUmberFormatterScientificStyle;  

在这种情况下, f1 不受更改的影响。

但是,如果您进行简单的分配:

NSNumberFormatter* f1= [NSNumberFormatter new];
f1.numberStyle= NSNUmberFormatterDecimalStyle;
NSNumberFormatter* f2= f1;
f2.numberStyle= NSNUmberFormatterScientificStyle;  

然后 f1 也会受到变化的影响。

如果您使用不可变对象,则不应该关心这种差异。

于 2013-01-05T20:00:21.300 回答
2

使用标准 object2 = object 是引用或指向分配。这意味着 object 和 object2 都应该指向同一个内存区域。应用于任一对象的任何更改都应同时影响它们(或更准确地说,它们都从完全相同的内存位置读取和写入)。

当您使用复制时,您将在内存中创建一个新部分并使用与对象相同的值填充它。在这种情况下,您有 2 个不同的内存区域,它们以相同的值开头。当您编辑对象时,您正在为该变量名编辑内存中的值。编辑对象 2 的值时,您仅编辑对象 2 的内存值。

当您的意思是两个变量名称都指向完全相同的内存区域时,您肯定希望使用引用方法来限制内存使用和开销。如果这两个对象是相互独立的,您需要创建和维护一个副本。

于 2013-01-05T20:04:35.520 回答