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
我正在解析 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