NSMutableArray更改旧存储数据问题

时间:2016-08-29 05:55:36

标签: ios objective-c nsmutablearray

我正在解析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时,我观察到我的原始数据被更改了。 请检查,我不希望我的原始数据被更改。请检查并告诉我我的代码在哪里出错。

2 个答案:

答案 0 :(得分:0)

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

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

像这样

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

您只需更新newArray,原始版本不会受到影响

答案 1 :(得分:0)

您的问题,因为您的所有媒体资源(ViewController->shippingArraySecondPageController->myshippingarrayPersonDtklSingleton->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