Сообщение Objective C было отправлено освобожденному объекту (зомби) по адресу: 0xaa722d0 - PullRequest
1 голос
/ 09 января 2012

Обновление: - [строка NSIndexPath]: сообщение отправлено освобожденному экземпляру 0x895fe70

Когда я запускаю свое приложение на устройстве и анализирую, он говорит:

Сообщение Objective C было отправлено освобожденному объекту (зомби) по адресу: 0xaa722d0.

Отображается ошибка в:

- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    int newRow = [indexPath row];
    int oldRow = (lastIndexPath != nil) ? [lastIndexPath row]: -1;

Я очень новичок в программировании на Objective C и уже два дня бьюсь над этой проблемой. Недавно я создал приложение, использующее Xcode 3.2.6, но обновил его до Xcode 4 два дня назад и теперь сталкиваюсь с проблемами освобождения памяти, описанными ниже. код. Я исследовал использование инструментов и включил зомби и понял, где проблема возникает, но просто не смог ее решить, Я прошу некоторые инструкции, пожалуйста .. ниже мой код запускается в Xcode 4.2.

#pragma mark -
#pragma mark Table Data Source Methods
- (NSInteger)tableView:(UITableView *)tableView 
 numberOfRowsInSection:(NSInteger)section {
    return [list count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CheckMarkCellIdentifier = @"CheckMarkCellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                             CheckMarkCellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                       reuseIdentifier:CheckMarkCellIdentifier] autorelease];
    }
    NSUInteger row = [indexPath row];
    NSUInteger oldRow = [lastIndexPath row];
    cell.textLabel.text = [list objectAtIndex:row];
    cell.accessoryType = (row == oldRow && lastIndexPath != nil) ? 
    UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;

    return cell;
}

#pragma mark -
#pragma mark Table Delegate Methods
- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    int newRow = [indexPath row];
    int oldRow = (lastIndexPath != nil) ? [lastIndexPath row]: -1;

    //----Captures the value selected in the list and shown in parent view.
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    SchneiderBMSAppDelegate *appDelegate = (SchneiderBMSAppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.priorityValue = cell.textLabel.text;

    NSLog(@"Product selected is: %@",appDelegate.priorityValue);

    if (newRow != oldRow)
    {
        UITableViewCell *newCell = [tableView cellForRowAtIndexPath:
                                    indexPath];
        newCell.accessoryType = UITableViewCellAccessoryCheckmark;

        UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: 
                                    lastIndexPath]; 
        oldCell.accessoryType = UITableViewCellAccessoryNone;
        lastIndexPath = indexPath;

    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (void)viewDidUnload {
    self.list = nil;
    self.lastIndexPath = nil;
    [super viewDidUnload];
}
- (void)dealloc {
   [list release];
    [lastIndexPath release];
    [super dealloc];
}

Ответы [ 2 ]

3 голосов
/ 09 января 2012

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

0 голосов
/ 02 марта 2012

У меня было приложение, которое использовало почти тот же код (не могу вспомнить, на какое учебное пособие я ссылался), которое я выполнил в iOS 4.3, но не выпустил в App Store. У меня была та же проблема, когда я недавно восстановил приложение и попытался запустить его в iOS 5. Я смог заставить его работать, изменив строку:

lastIndexPath = indexPath;

до

self.lastIndexPath = indexPath;

А потом в iOS 5 все работало нормально. Полагаю, оно выполняет то же самое, что рекомендовал Чак, сохраняя объект. Но почему iOS 5 заботится, а не iOS 4.3 ??? Может ли это быть из-за ARC в iOS 5?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...