将 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 开发
我正面临一个非常奇怪的问题。当您将NSMutableArray
s 分配给另一个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
,因为NSArray
s 不可更改。但我真的很想知道为什么会这样?我是否遗漏了一些非常明显的东西?
谢谢!
【问题讨论】:
这是完全正常的。 【参考方案1】:是的,对象在面向对象语言中的工作方式是,您给对象起的名称(one
和 two
)只是指向对象的指针,而不是实际对象。当您将一个对象设置为另一个对象时,它只是将其设置为指向同一对象的指针。
在 Objective-C 和其他一些语言中,对象是您创建的任何名称前带有 *
的东西。
如果您想复制实际对象而不是指向该对象的指针,您可以这样做:
two = [[NSMutableArray alloc] initWithArray:one];
这将创建一个新数组作为two
并添加来自one
的所有值。
【讨论】:
不确定我会说这是“面向对象语言”的东西。 太棒了,谢谢!最后我明白了:) 猜我的基础很薄弱。再次感谢:D【参考方案2】:原因是你将数组二对一指向,所以它会一直显示数组一的内容。
【讨论】:
【参考方案3】:two = one;
它不会复制。它只是引用了相同的内存。
【讨论】:
以上是关于将 NSMutableArray 分配给另一个时的奇怪行为(iOS 6)的主要内容,如果未能解决你的问题,请参考以下文章