使用addObject后修改NSMutableArray内容的困惑:

时间:2015-07-10 15:52:12

标签: objective-c macos

所以,当我修改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

2 个答案:

答案 0 :(得分:1)

  

我认为addObject:总是在将对象添加到接收addObject:消息的数组之前复制该对象。情况不是这样吗?

addObject:不会复制该对象。 NSArray不要求其内容甚至可以复制(不是一切都是)。这可能解释了混乱。如果你想复制它,你需要自己这样做。

答案 1 :(得分:0)

你几乎回答了自己的问题。当您创建NSMutableArray并向其添加对象时,您只需创建指向该对象的指针,无论它存储在何处。如果将同一对象添加到另一个NSMutableArray,那么它也包含指向同一事物的指针。你可能不需要这个类比,但是对于其他任何混淆的人 - NSMutableArray就像一个邮寄地址的邮递员,对象就是那个地址的房子。两个邮差(或两个阵列)可以拥有同一个房子的地址,但仍然只有一个房子。 (也就是说,除非有人明确'复制'房子。)

因此,在您的第二行到最后一行代码中,您更改了.clientName属性,您将更改原始* test2对象的属性。

值得注意的是,在这种情况下,如果删除第二个数组,则不会删除它必须包含的对象。因此,在您的情况下,从内存中删除第二个NSMutableArray并不意味着它的所有对象也会从内存中消失 - 除非指向这些对象的所有其他内容也被删除。该数组不包含指向这些对象的唯一副本的指针 - 它只指向原始数据。