NSMutableArray 在单例中使用字典自动更新

NSMutableArray auto updates with Dictionary in singleton

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

@property (nonatomic, retain) NSMutableArray *myArray;

已在 viewDidload 中初始化:

_myArray = [[NSMutableArray alloc] init];

然后在 viewDidAppear 中,我将数组分配给单例 NSMutableDictionary *myDict 值:

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

在对 _m​​yArray 做任何事情之前,我在计时器中监视 _myArray 值,它似乎总是随着单例字典值不断变化。

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

这不是什么奇怪的问题,这就是 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];

您需要按如下方式复制该对象:

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