NSMutableArray 更改旧存储数据问题

NSMutableArray changing old stored data issue

我正在解析 JSON 并将该数据存储到我主页上的 NSMutableArray 中。我想在我的另一个页面上访问该数据,而不是一个接一个地访问该数据,所以我使用单例模式在我的主页中共享公共数据。我将该 NSMutableArray 数据存储到 Singleton 文件中以供公共访问。在第二页中,我在 tableview 中显示了该数据。有一个修改数据但不会改变原始数据的按钮,即主页arraydata。所以我将该数据存储到 clonearray 并更新 clonearray。但是当我 return 返回主页并在 ViewDidAppear 放置断点后,我观察到我的原始数据已更改。

请查看此问题并纠正我的代码错误。

为了获得更多参考,我添加了项目 link 请下载并查看:[项目 Link][1]

在这个项目中,我创建了 2 个视图控制器、1 个模型 class 和一个用于所有文件中公共数据的单例。

视图控制器:

在这个文件中,我正在解析 JSON 并存储在 NSMutableArray 中,并将相同的数组数据设置为 Singleton 文件数组,以便在所有文件中进行公共访问。

第二个视图控制器:

在这个文件中,我从 Singleton 文件中获取数组数据并存储在本地数组中。

一键修改数据。在修改数据函数中,我正在修改数据并存储在另一个数组中以供公共访问 (clonearray)。

但是当我 return 回到 First View Controller 并在 ViewDidAppear 放置断点后,我观察到我的原始数据发生了变化。 请检查,我不想更改我的原始数据。请检查并建议我我的代码哪里做错了。

如果你更新数据时我没有错,它会更改你的两个数据,因为它引用相同的内存

您需要分配一块新内存并将数据复制到一个新数组中

像这样

NSMutableArray *newArray=[[NSMutableArray alloc] initWithArray:originalArray copyItems:YES];

你只更新newArray,原来的不会受到影响

你的问题是因为你所有的 属性( ViewController->shippingArray, SecondPageController->myshippingarray, PersonDtklSingleton->shippingAddress) 都指向同一个数组。

您可以通过使用 Deep Copies 克隆数组来解决问题,将原始数组复制到新数组。确保原始数组中的所有项目都采用 NSCopying.

SecondPageController

@implementation SecondPageController
...
- (void)viewDidLoad {
    [super viewDidLoad];

    myshippingarray=[[NSMutableArray alloc]init];

    // deep copy
    self.myshippingarray = [[NSMutableArray alloc] initWithArray:[[PersonDtklSingleton sharedInstance]shippingAddress] copyItems:YES];
    // Do any additional setup after loading the view.
}
...
@end

人物模型

@implementation PersonModel
@synthesize housernumber,resident,street,city,pincode,defaultAddress;

- (id)copyWithZone:(NSZone *)zone {
    PersonModel *copyObj = [PersonModel new];
    copyObj.housernumber = [self.housernumber copyWithZone:zone];
    copyObj.resident = [self.resident copyWithZone:zone];
    copyObj.street = [self.street copyWithZone:zone];
    copyObj.city = [self.city copyWithZone:zone];
    copyObj.pincode = [self.pincode copyWithZone:zone];
    copyObj.defaultAddress = [self.defaultAddress copyWithZone:zone];
    return copyObj;
}

@end