gpt4 book ai didi

ios - 当 NSDictionary 添加到数组中时,它会替换之前的字典

转载 作者:行者123 更新时间:2023-11-28 23:10:13 25 4
gpt4 key购买 nike

更新:想出了一些东西并更改了代码。

当我将 NSDictionary 添加到我的数组时,它突然替换了我上次添加的字典。我不知道为什么会这样。我正在使用 plist 作为数据存储。

我收到这样的错误消息:

Thread 1:Program received signal: "EXC_BAD_ACCESS".

初始化

-(id)init{
self=[super init];
if(self){
dbArray = [[NSMutableArray alloc] init];
}
return self;
}

添加新项目。

-(void)addNewItem:(NSString *)aString
{
// Creates a mutable dictionary with a anonymous string under the NAME key.
NSDictionary *newString = [[NSDictionary alloc] initWithObjectsAndKeys:aString,@"name", nil];

// Adds the new string to empty dbArray.
[dbArray addObject:(newString)];
NSLog(@"[add]:Added anonymous string to dbArray, under name key.");

// Writes the current dbArray (with the dict) to plist and releases retain counts.
[self writeItem];
[newString release];
}

我查看数据的方法。

-(void)viewData
{
// View data from the created plist file in the Documents directory.

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *finalPath = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:finalPath]) {
self.dbArray = [NSMutableArray arrayWithContentsOfFile:finalPath];
}
else {
self.dbArray = [NSMutableArray array];
}
}

最佳答案

代替这个

self.dbArray = [[NSMutableArray alloc] init];

用这个

if( nil == self.dbArray ) {
self.dbArray = [[NSMutableArray alloc] init];
}

更新:(基于提供的代码)

  • 您正在使用 DataObject 类的不同实例来显示和保存数据。您的内容被覆盖了,因为您在每个实例的初始化期间没有从文件加载数据;要快速解决这个问题,您需要实现 DataObject 类的 init 方法,如下所示:
- (id)init{
self = [super init];
if(self){
[self viewData];
}
return self;
}

来自 ViewController 类的 viewDidLoad 的以下代码会经常使您的应用程序崩溃:

db = [[DataObject alloc] init];
[db viewData];
[db release];

array = [[NSMutableArray alloc] initWithArray:[db dbArray]];

替换为

db = [[DataObject alloc] init];
[db viewData];

array = [[NSMutableArray alloc] initWithArray:[db dbArray]];

仅在 dealloc 实现中调用 [db release]

  • 您可能会遇到的另一个问题是当您返回主屏幕时未显示更新的数据;要解决此问题,请将以下方法实现添加到您的 ViewController.m 文件中:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];

[db viewData];
self.array = [NSMutableArray arrayWithArray: db.dbArray];
[self.tableView reloadData];
}

同样在AddView.m中替换下面的代码

// Dismiss view and reload tableview.
ViewController *vc = [[ViewController alloc] init];
[self dismissModalViewControllerAnimated:YES];
[vc release];

// Dismiss view and reload tableview.
[self dismissModalViewControllerAnimated:YES];

正如建议:查看有关使用委托(delegate)以及在对象之间传递对象实例和副本的更多信息。

关于ios - 当 NSDictionary 添加到数组中时,它会替换之前的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8475379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com