将 NSMutableArray 分配给另一个时的奇怪行为(iOS 6)

Posted

技术标签:

【中文标题】将 NSMutableArray 分配给另一个时的奇怪行为(iOS 6)【英文标题】:Weird behaviour when assigning a NSMutableArray to another (iOS 6) 【发布时间】:2013-07-29 06:52:18 【问题描述】:

我正在 Xcode 4.6.1 上为 ios 6 开发

我正面临一个非常奇怪的问题。当您将NSMutableArrays 分配给另一个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);

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

这是日志:

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

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

谢谢!

【问题讨论】:

这是完全正常的。 【参考方案1】:

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

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

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

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

这将创建一个新数组作为two 并添加来自one 的所有值。

【讨论】:

不确定我会说这是“面向对象语言”的东西。 太棒了,谢谢!最后我明白了:) 猜我的基础很薄弱。再次感谢:D【参考方案2】:

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

【讨论】:

【参考方案3】:
two = one;

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

【讨论】:

以上是关于将 NSMutableArray 分配给另一个时的奇怪行为(iOS 6)的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NSMutableArray 传递给另一个视图

如何将 NSMutableArray 传递给另一个 ViewController 类

将结构成员指针分配给另一个动态内存分配的指针是不是安全?

将指针值分配给另一个指针值。我做错了吗?

将结构的第一个变量分配给另一个

将一个枚举类型分配给另一个枚举类型