我有两个不同的NSArray对象,让我们说 -上午我给内容或内存地址,目标C
NSArray* a and NSArray* b
数组b是用来存放从csv文件文本内容。
现在。如果我做了如下操作:
a = b;
我是不是将b的内容复制到a中或者我在指向b?在前一种情况下,对数组a进行的更改不会反映在数组b中。另一方面,在后一种情况下,他们会。
谢谢
我有两个不同的NSArray对象,让我们说 -上午我给内容或内存地址,目标C
NSArray* a and NSArray* b
数组b是用来存放从csv文件文本内容。
现在。如果我做了如下操作:
a = b;
我是不是将b的内容复制到a中或者我在指向b?在前一种情况下,对数组a进行的更改不会反映在数组b中。另一方面,在后一种情况下,他们会。
谢谢
只是一个内存地址(引用)。
如果你来自C开发,你应该知道星号*
靠近NSArray类型意味着它是一个指针类型。这在Objective-C中是一样的。 (如果你不知道C和这东西有关指针,只是忘记它,在ObjC每个对象类型是一个指针,它是相当透明的,以最后的编码器)
如果你想创建一个独立副本的b
,这样修改a
不会修改b然后,使用copy
方法。 (如果你做什么,不要忘记晚些时候发布它,因为任何alloc/retain/copy
必须由一个release/autorelease
通话结束时平衡)反正
注意的NSArray
是构建不变,这意味着不存在方法在NSArray
类中修改其内容。因此,对于您的确切示例,指向相同的NSArray
(不进行深度复制)是不是一个真正的问题,因为您无法修改NSArray
。
仅当您使用NSMutableArray
时,才会出现问题,该方法确实有修改其内容的方法。 当可变类的工作就像NSMutableArray
,你则应该使用mutableCopy
有一个可变副本(的copy
它返回一个不可变的对象,而不是)
让我说明这一点在下面的例子:
NSMutableArray* a = [NSMutableArray arrayWithObjects:@"a",@"b",@"c"];
NSMutableArray* b = a; // points to the same object as a
NSArray* c = [[a copy] autorelease]; // immutable copy
NSMutableArray* d = [[a mutableCopy] autorelease]; // mutable copy, independant with a
// Now if you modify a...
[a addObject:@"d"];
// ...then b is also modified (it is the same object)
// but c and d aren't.
[d addObject:@"independant"];
// this does only modify d, but neither a, b or c.
// [c addObject:@"illegal"]; // <-- can't do this, addObject is a method of NSMutableArray, non-existing on NSArray.
a和b都是内存地址的'指针'。当您将a赋值给b时,它们现在只是指向相同的内存地址。
欲了解更多有关指针:
刚内存地址。有明确的方法可以创建该数组的副本。但是,如上所述的简单分配不会导致复制。
在C语言中,两个指针都指向相同的内存地址。
*(注意:编辑的答案添加示例代码和有关可变/不可变类的特殊注意事项)* – AliSoftware
高超的答案与真正好的例子。一个 – SayeedHussain