我在 Objective-C 中做了一些测试,我对copy
方法有疑问。有什么区别:
id object2 = [object copy];
和:
id object2 = object;
?
object = nil
在此注释之后是否可见差异?那么在第一种情况下object2
等于object
但在第二种情况下object2
等于nil
?何时copy
正确使用方法?
谢谢你的解释。
我在 Objective-C 中做了一些测试,我对copy
方法有疑问。有什么区别:
id object2 = [object copy];
和:
id object2 = object;
?
object = nil
在此注释之后是否可见差异?那么在第一种情况下object2
等于object
但在第二种情况下object2
等于nil
?何时copy
正确使用方法?
谢谢你的解释。
第一种方法复制一个对象(如果它符合<NSCopying>
协议)——即它创建一个逻辑上等同于旧实例的对象的新实例。这两个对象将位于内存中的不同位置。
+----------+ +---------------------------------------------+
| Object 1 | | Copy of object 1, with identical properties |
+----------+ +---------------------------------------------+
^ ^
| |
"object" "object2"
第二行仅将指针分配给object
变量object2
- 它不会创建新实例,指针将指向完全相同的对象:
+--------+
| Object |
+--------+
^ ^
| +--------------+
"object" "object2"
当 object = nil 时差异是否可见?
不,从那时起两个变量都将是nil
(nil
Obejctive-C 中的消息传递总是产生nil
或 0)。
何时正确使用复制方法?
每当您需要复制现有对象时,例如当您想要修改其上的某些属性而不影响原始对象时。
不同之处在于,如果您复制对象,您将拥有一个独立的副本,并且如果您更改该对象,则原始对象不会受到影响。
例如你有一个 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 也会受到变化的影响。
如果您使用不可变对象,则不应该关心这种差异。
使用标准 object2 = object 是引用或指向分配。这意味着 object 和 object2 都应该指向同一个内存区域。应用于任一对象的任何更改都应同时影响它们(或更准确地说,它们都从完全相同的内存位置读取和写入)。
当您使用复制时,您将在内存中创建一个新部分并使用与对象相同的值填充它。在这种情况下,您有 2 个不同的内存区域,它们以相同的值开头。当您编辑对象时,您正在为该变量名编辑内存中的值。编辑对象 2 的值时,您仅编辑对象 2 的内存值。
当您的意思是两个变量名称都指向完全相同的内存区域时,您肯定希望使用引用方法来限制内存使用和开销。如果这两个对象是相互独立的,您需要创建和维护一个副本。