#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).
Итак, чтобы исправить это, освободите объект после того, как вы закончите с 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]. Уникальный идентификатор;