我有一个奇怪的问题。我有一个带字典的单例。此字典在运行时定期更新。在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,它不会以某种方式绑定到这个字典单例?
答案 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];