2010-05-18 6 views
2

Я пытался архивировать объект в файл plist и загружать его позже, чтобы заполнить таблицуView. Кажется, что файл заархивирован правильно, но я получаю плохой доступ, пытаясь получить значение из файла.NSKeyedUnarchiver - Плохой доступ

Я что-то не так?

Это где я сохранить его

// Create some phonebook entries and store in array 
NSMutableArray *book = [[NSMutableArray alloc] init]; 
Phonebook *chris = [[Phonebook alloc] init]; 
chris.name = @"Christian Sandrini"; 
chris.phone = @"1234567"; 
chris.mail = @"[email protected]"; 
[book addObject:chris]; 
[chris release]; 

Phonebook *sacha = [[Phonebook alloc] init]; 
sacha.name = @"Sacha Dubois"; 
sacha.phone = @"079 777 777"; 
sacha.mail = @"[email protected]"; 
[book addObject:sacha]; 
[sacha release]; 

Phonebook *steve = [[Phonebook alloc] init]; 
steve.name = @"Steve Solinger"; 
steve.phone = @"079 123 456"; 
steve.mail = @"[email protected]"; 
[book addObject:steve]; 
[steve release]; 

[NSKeyedArchiver archiveRootObject:book toFile:@"phonebook.plist"]; 

И здесь я стараюсь, чтобы получить его из файла и сохранить его обратно в массив

- (void)viewDidLoad { 
    // Load Phone Book 
    NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithFile:@"phonebook.plist"]; 

    self.list = arr; 

    [arr release]; 
    [super viewDidLoad]; 
} 

часть, где я пытаюсь построить клетка

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *PhoneBookCellIdentifier = @"PhoneBookCellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:PhoneBookCellIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:PhoneBookCellIdentifier] autorelease]; 
    } 

    NSUInteger row = [indexPath row]; 
    Phonebook *book = [self.list objectAtIndex:row]; 
    cell.textLabel.text = book.name; 
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 

    return cell; 
} 

Здесь плохая ошибка доступа

Текущий язык: авто; В настоящее время Objective-C Утверждение не удалось: (ЦБС), функции GetName, файл /SourceCache/objc4_Sim/objc4-427.5/runtime/objc-runtime-new.mm, линии 3990. Утверждение не удалось: (ЦБС), функции GetName, файл /SourceCache/objc4_Sim/objc4-427.5/runtime/objc-runtime-new.mm, линии 3990. Утверждение не удалось: (ЦБС), функции GetName, файл /SourceCache/objc4_Sim/objc4-427.5/runtime /objc-runtime-new.mm, линии 3990. Утверждение не удалось: (ЦБС), функция GetName, файл /SourceCache/objc4_Sim/objc4-427.5/runtime/objc-runtime-new.mm, линии 3990.

+0

I Не уверен, что это единственная проблема, но вы не должны выпускать arr в viewDidLoad. – walkytalky

ответ

2

Просто чтобы развернуть эту долю: unarchiveObjectWithFile вернет указатель с автореализацией. Вы не локально retain, поэтому вам не следует release. Поскольку вы это делаете, объект впоследствии освобождается, и к моменту, когда вы его используете, вызывая book.name, его там нет.

(я предполагаю self.list свойство сохранения соответствующим образом, чтобы объект будет храниться вокруг до тех пор, пока вы не отпустите здесь. Если нет, то вам нужно исправить это тоже.)

+0

Вы мужчина ;-) Устранение проблемы [arr release] решило проблему. Большое спасибо! – Chris

+0

Этот ответ спас мой день - спасибо! – Micko

Смежные вопросы