0

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

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

我收到这样的错误消息:

线程 1:程序接收信号:“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];
    }
}
4

2 回答 2

1

我认为您正在创建一个新数组:

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

viewDidLoad您应该在您的 init 或 init 上创建 dbArray UIViewController(我假设您在 an 上使用它UIViewController

在您的 DataObject 中执行以下操作:

  -(id)init{
    self=[super init];
    if(self){
      self.dbArray = [[NSMutableArray alloc] init];
   }
   return self;
  }
于 2011-12-12T14:10:50.593 回答
1

而是这个

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]];

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

  • 另一个问题,你可能会出现 - 当你回到主屏幕时不显示更新的数据;要解决这个问题,请将以下方法实现添加到您的 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];

正如建议:请参阅有关使用委托和在对象之间传递对象实例和副本的更多信息。

于 2011-12-12T14:10:59.867 回答