0

我正在 Xcode 4.6.1 上为 iOS 6 开发

我正面临一个非常奇怪的问题。当您NSMutableArray将它们分配给另一个时,它们会以某种方式“链接”NSMutableArray吗?

这是我的代码:

ViewController.m

@interface ViewController ()
{
    NSMutableArray *one;
    NSMutableArray *two;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    one = [[NSMutableArray alloc] init];
    two = [[NSMutableArray alloc] init];

    [one addObject:@"item1"];
    [one addObject:@"item2"];
    [one addObject:@"item3"];

    two = one;

    NSLog(@"First log: %@ and %@",one, two);

    [one addObject:@"item4"];

    NSLog(@"Second log: %@ and %@",one, two);
}

我只是添加 3 个项目到one. 然后我将它分配给two. 现在,当我将另一个对象添加到 时one,它也会被添加到two。为什么是这样?它们是否以某种方式“链接”?

这是日志:

First log: (
    item1,
    item2,
    item3
) and (
    item1,
    item2,
    item3
)
Second log: (
    item1,
    item2,
    item3,
    item4
) and (
    item1,
    item2,
    item3,
    item4
)

我的解决方法是使用 aNSArray而不是NSMutableArray因为NSArrays 不可更改。但我真的很想知道为什么会这样?我错过了一些非常明显的东西吗?

谢谢!

4

3 回答 3

3

是的,对象在面向对象语言中的工作方式是您给对象的名称 ( oneand two) 只是指向对象的指针,而不是实际对象。当您将一个对象设置为另一个对象时,它只是将其设置为指向同一对象的指针。

在 Objective-C 和其他一些语言中,对象是您*在名称前添加的任何东西。

如果要复制实际对象而不是指向对象的指针,则可以这样做:

two = [[NSMutableArray alloc] initWithArray:one];

这将创建一个新的 Arraytwo并添加来自 的所有值one

于 2013-07-29T06:56:44.593 回答
1

原因是你指向数组二对一,所以它会一直显示数组一的内容。

于 2013-07-29T06:57:07.953 回答
1
two = one;

它不会复制。它只是引用相同的内存。

于 2013-07-29T06:59:34.660 回答