2011-09-06 69 views
0

我有两个不同的NSArray对象,让我们说 -上午我给内容或内存地址,目标C

NSArray* a and NSArray* b 

数组b是用来存放从csv文件文本内容。

现在。如果我做了如下操作:

a = b; 

我是不是将b的内容复制到a中或者我在指向b?在前一种情况下,对数组a进行的更改不会反映在数组b中。另一方面,在后一种情况下,他们会。

谢谢

回答

4

只是一个内存地址(引用)。

如果你来自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. 
+0

*(注意:编辑的答案添加示例代码和有关可变/不可变类的特殊注意事项)* – AliSoftware

+0

高超的答案与真正好的例子。一个 – SayeedHussain

3

只是地址。

如果你愿意,你就会有一个副本做一些事情,如:

a = [b copy]; 
+0

谢谢你完美 – doNotCheckMyBlog

1

刚内存地址。有明确的方法可以创建该数组的副本。但是,如上所述的简单分配不会导致复制。

在C语言中,两个指针都指向相同的内存地址。