【问题标题】:Weird behaviour when assigning a NSMutableArray to another (iOS 6)将 NSMutableArray 分配给另一个时的奇怪行为(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 不可更改。但我真的很想知道为什么会这样?我是否遗漏了一些非常明显的东西?

谢谢!

【问题讨论】:

  • 这是完全正常的。

标签: objective-c ios6 nsmutablearray nsarray xcode4.6


【解决方案1】:

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

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

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

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

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

【讨论】:

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

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

【讨论】:

    【解决方案3】:
    two = one;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2012-10-13
      • 2014-10-13
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      相关资源
      最近更新 更多