我正在解析JSON并将该数据存储到我主页上的NSMutableArray
。我想访问我的另一页上的数据而不是另一页,所以我使用Singleton Pattern在我的主页上共享公共数据。我将NSMutableArray数据存储到Singleton文件以进行公共访问。在第二页中,我将在tableview
中显示该数据。有一个按钮可以修改数据,但不会更改原始数据,即主页arraydata
。所以我将这些数据存储到clonearray
并更新clonearray
。但是当我返回主页并在放置断点后在ViewDidAppear
中,我观察到我的原始数据被更改了。
请查看此问题,并在我的代码出错的地方纠正我。
如需更多参考,请添加项目链接,请下载并查看:[Project Link] [1]
在这个项目中,我为所有文件创建了2个View Controllers,1个模型类和一个Singleton,用于公共数据。
查看控制器:
在这个文件中,我正在解析JSON并存储在NSMutableArray中,并将相同的数组数据设置为Singleton文件数组,以便在所有文件中进行公共访问。
SecondViewController:
在这个文件中,我从Singleton文件获取数组数据并存储在本地数组中。
有一个按钮可以修改数据。在修改数据函数中,我正在修改数据并存储在另一个数组中以进行公共访问(clonearray
)。
但是当我在放置断点后返回到First View Controller和ViewDidAppear
时,我观察到我的原始数据被更改了。
请检查,我不希望我的原始数据被更改。请检查并告诉我我的代码在哪里出错。
答案 0 :(得分:0)
如果我更新数据时没有错,它会改变你的两个数据,因为它引用了相同的内存
您需要分配新内存并将数据复制到新数组
像这样NSMutableArray *newArray=[[NSMutableArray alloc] initWithArray:originalArray copyItems:YES];
您只需更新newArray,原始版本不会受到影响
答案 1 :(得分:0)
您的问题,因为您的所有媒体资源(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
<强> PersonModel 强>
@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