NSMutableArray使用单例中的Dictionary自动更新

时间:2016-11-16 03:55:47

标签: ios singleton nsmutablearray

我有一个奇怪的问题。我有一个带字典的单例。此字典在运行时定期更新。在viewcontroller中,我访问这个单例字典并创建一个新的NSMutableArray。

@property (nonatomic, retain) NSMutableArray *myArray;

在viewDidload中初始化它:

_myArray = [[NSMutableArray alloc] init];

然后在viewDidAppear中,我将数组赋值给singleton NSMutableDictionary * myDict值:

_myArray = [NSMutableArray arrayWithArray:[[[DataCenter singleton] myDict] allValues]];

在对_myArray 做任何事情之前,我会在一个计时器中监视_myArray值,并且它似乎总是继续按照单例字典值进行更改。

为什么以及如何创建一个独立的NSMutableArray,它不会以某种方式绑定到这个字典单例?

2 个答案:

答案 0 :(得分:3)

这不是一个奇怪的问题,它是Objective-C的工作原理。您的单例数组只是对象引用的集合。您已使用完全相同的引用填充_myArray。一个中的所有修改都将被另一个修改,因为它们是相同的对象。

为了实际制作新对象,您需要制作副本。像这样:

_myArray = [[NSMutableArray alloc] initWithArray:[[[DataCenter singleton] myDict] allValues] copyItems:YES];

修改

我无法在编译器中使用[[[DataCenter singleton] myDict] allValues]进行测试,但是如果您想尝试使用deepCopy和数组,那么这是一个人为的例子。

NSArray *array = [NSArray arrayWithObject:@"foo"];
NSMutableArray* _myArray = [[NSMutableArray alloc] initWithArray:array copyItems:YES];

答案 1 :(得分:0)

您需要复制该对象,如下所示:

_myArray =[[NSMutableArray arrayWithArray:[[[DataCenter singleton] myDict] allValues]]mutableCopy];