所以,当我修改NSMutableArray内部的东西时,我没有得到我期望的结果。我认为构建这个问题的最好方法是举个例子。以下代码打印“george”(如预期的那样):
NSMutableArray *originalArray = [[NSMutableArray alloc] initWithObjects:@"sally",@"george", nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
[secondArray addObject:originalArray[1]];
secondArray[0] = @"priscilla";
NSLog(@"%@",originalArray[1]);
但是这段代码打印出“priscilla”:
TestClass *test1 = [[TestClass alloc] init];
test1.clientName = @"sally";
TestClass *test2 = [[TestClass alloc] init];
test2.clientName = @"george";
NSMutableArray *originalArray = [[NSMutableArray alloc] initWithObjects:test1,test2, nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
[secondArray addObject:originalArray[1]];
TestClass *objectTakenFromSecondArray = secondArray[0];
objectTakenFromSecondArray.clientName = @"priscilla";
NSLog(@"%@", ((TestClass *)originalArray[1]).clientName);
我认为addObject:总是在将对象添加到接收addObject:消息的数组之前复制该对象。情况不是这样吗?
谢谢!
P.S。这是TestClass的接口和实现,如果它是相关的:
@interface TestClass : NSObject
@property (strong,nonatomic) NSString *clientName;
@end
@implementation TestClass
@synthesize clientName = _clientName
@end
答案 0 :(得分:1)
我认为addObject:总是在将对象添加到接收addObject:消息的数组之前复制该对象。情况不是这样吗?
addObject:
不会复制该对象。 NSArray
不要求其内容甚至可以复制(不是一切都是)。这可能解释了混乱。如果你想复制它,你需要自己这样做。
答案 1 :(得分:0)
你几乎回答了自己的问题。当您创建NSMutableArray并向其添加对象时,您只需创建指向该对象的指针,无论它存储在何处。如果将同一对象添加到另一个NSMutableArray,那么它也包含指向同一事物的指针。你可能不需要这个类比,但是对于其他任何混淆的人 - NSMutableArray就像一个邮寄地址的邮递员,对象就是那个地址的房子。两个邮差(或两个阵列)可以拥有同一个房子的地址,但仍然只有一个房子。 (也就是说,除非有人明确'复制'房子。)
因此,在您的第二行到最后一行代码中,您更改了.clientName属性,您将更改原始* test2对象的属性。
值得注意的是,在这种情况下,如果删除第二个数组,则不会删除它必须包含的对象。因此,在您的情况下,从内存中删除第二个NSMutableArray并不意味着它的所有对象也会从内存中消失 - 除非指向这些对象的所有其他内容也被删除。该数组不包含指向这些对象的唯一副本的指针 - 它只指向原始数据。