UIViewController представлен в виде таблицы — не уничтожается при извлечении

#iphone #objective-c #memory-management #sdk #uiviewcontroller

#iPhone #objective-c #управление памятью #sdk #uiviewcontroller

Вопрос:

У меня есть табличное представление, которое представляет UIViewController всякий раз, когда используется строка (отображает подробную информацию для этой конкретной строки).

Код выглядит следующим образом :

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

{ 

if (!detail) {

detail = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];        

}

PlaceObject *info = [locationInfo objectAtIndex:indexPath.row];

detail.UniqueID = info.UniqueID;
detail.hidesBottomBarWhenPushed = YES;

[self.navigationController pushViewController:detail animated:YES];

self.detail = nil;
[detail release];

}
  

Проблема в том, что «detail», похоже, не уничтожается при извлечении из стека (когда пользователь возвращается к табличному представлению).

У меня есть несколько IBOutlets и переменных в классе UIViewController «detail», которые я освобождаю при освобождении следующим образом :

 - (void)dealloc
{
NSLog(@"Deallocing");

[storedURL release];
[storedNumber release];
[storedLocation release];
[nameLabel release];
[postCode release];
[description release];
[openTime release];
[nearestTube release];
[area release];
[image release];
[name release];
[phoneNumber release];
[scroll release];
[picture release];
[addressOne release];
[cost release]; 

[super dealloc];

}
  

Кто-нибудь может посоветовать, почему «детали» могут не уничтожаться, когда пользователь возвращается к табличному представлению?

Редактировать

Хорошо, приведенный выше код теперь работает отлично. Ключ, казалось, устанавливал detail равным нулю — хотя не уверен, почему.

Ответ №1:

Пара вещей:

  1. Вы выделяете / инициализируете его, но не освобождаете. Это проблема.
  2. Вы присваиваете ему свойство (которое, вероятно, настроено на сохранение). Это проблема из-за (1).

Итак, чтобы исправить это, освободите объект после того, как вы закончите с in в локальной области (конец этого метода). И поскольку это свойство, освободите его в методе dealloc класса-владельца.

Комментарии:

1. Я добавил [подробный выпуск] в конце метода, а также [подробный выпуск] в методе dealloc. Теперь представление освобождено, но теперь происходит сбой при [super dealloc] в объекте «detail». Почему это должно происходить?

Ответ №2:

количество выделений / инициализаций — сохранить: 1

настройка с помощью свойства — количество сохранений: 2

нажатие на навигационный контроллер — количество сохранений: 3

отключается навигационный контроллер — количество сохранений: 2

Предполагается, что свойство имеет флаг сохранения, но в любом случае ваш счетчик сохранения никогда не достигает 0

Комментарии:

1. Спасибо. Сейчас происходит освобождение. Однако, когда я нажимаю на ячейку таблицы во второй раз, приложение теперь выходит из строя из-за «неправильного доступа Exc»?

Ответ №3:

Предположим, что detail это сохраненное свойство. Переопределите средство получения для создания отложенного экземпляра.

 - (DetailViewController *)detail
{
    if (!detail)
    {
        detail = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        detail.hidesBottomBarWhenPushed = YES;
    }

    return detail;
}
  

Кроме того, убедитесь, что вы отправляете только -release в detail -dealloc . Ваш -tableView:didSelectRowAtIndexPath: теперь выглядит следующим образом.

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath       *)indexPath 
{ 
    detail.UniqueID = [locationInfo objectAtIndex:indexPath.row].UniqueID;
    [self.navigationController pushViewController:self.detail animated:YES];
}
  

Комментарии:

1. Это вызывает ошибку в: detail. UniqueID = [LocationInfo objectAtIndex:indexPath.row]. Уникальный идентификатор;