NSKeyedUnarchiver - Плохой доступ - PullRequest
2 голосов
/ 18 мая 2010

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

Я что-то не так делаю?

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

// 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 = @"christian.sandrini@example.com";
[book addObject:chris];
[chris release];

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

Phonebook *steve = [[Phonebook alloc] init];
steve.name = @"Steve Solinger";
steve.phone = @"079 123 456";
steve.mail = @"steve.solinger@wuhu.com";
[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;
}

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

Текущий язык: авто; В настоящее время target-c Утверждение не удалось: (cls), функция getName, файл /SourceCache/objc4_Sim/objc4-427.5/runtime/objc-runtime-new.mm, строка 3990. Не удалось подтвердить: (cls), функция getName, файл /SourceCache/objc4_Sim/objc4-427.5/runtime/objc-runtime-new.mm, строка 3990. Не удалось подтвердить: (cls), функция getName, файл /SourceCache/objc4_Sim/objc4-427.5/runtime/objc-runtime-new.mm, строка 3990. Не удалось подтвердить: (cls), функция getName, файл /SourceCache/objc4_Sim/objc4-427.5/runtime/objc-runtime-new.mm, линия 3990.

1 Ответ

2 голосов
/ 18 мая 2010

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

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

...