Когда NSDictionary добавляется в массив, он заменяет предыдущий словарь - PullRequest
0 голосов
/ 12 декабря 2011

ОБНОВЛЕНИЕ: Выяснили некоторые вещи и изменили код.

Когда я добавляю свой NSDictionary в мой массив, он внезапно заменяет предыдущий словарь, который я добавил в прошлый раз. Я не знаю, почему это происходит. Я использую plist в качестве хранилища данных.

Я получаю сообщение об ошибке, подобное этому:

Поток 1: Программа получила сигнал: "EXC_BAD_ACCESS".

Init

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

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

вместо этого

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

используйте это

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

ОБНОВЛЕНИЕ: (на основе предоставленного кода)

  • вы используете разные экземпляры класса DataObject для отображения и сохранения данных. Ваш контент перезаписан, потому что вы не загружаете данные из файла во время инициализации каждого экземпляра; чтобы исправить это быстро, вам нужно реализовать метод init вашего класса DataObject, как показано ниже:
- (id)init{
    self = [super init];
    if(self){
      [self viewData];
    }
    return self;
}

следующий код из viewDidLoad класса ViewController очень часто приводит к сбою приложения:

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

Так же, как совет: смотрите больше информации об использовании делегатов и передаче экземпляров объектов и копий между объектами.

1 голос
/ 12 декабря 2011

Я думаю, что вы создаете новый массив:

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

Вы должны создать dbArray на viewDidLoad или в начале вашего UIViewController (я предполагаю, что вы используете это наUIViewController)

внутри вашего объекта DataObject:

  -(id)init{
    self=[super init];
    if(self){
      self.dbArray = [[NSMutableArray alloc] init];
   }
   return self;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...