Объект dealloc только вылетает в iOS 4.3 - PullRequest
2 голосов
/ 27 декабря 2011

Я пытаюсь выяснить, почему нажатие viewController в моем tableView с помощью didSelectRowAtIndexPath может вызвать сбой в iOS 4.3, но в iOS 5.0+ работает нормально.

Сбой происходит, когда я вызываю:

self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease];

в любое время после первого нажатия на customViewController.

Вот мой соответствующий код:

@property (nonatomic, retain) CustomViewController *customViewController;

-(void) dealloc // Dealloc of tableView.
{

[customViewController release];
customViewController = nil;

}


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

self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease]; // Release old, allocate new, set it.

[[self navigationController] pushViewController:customViewController animated:YES];
[customViewController release]; // Balance out pushViewController's retain.


}

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease];
[[self navigationController] pushViewController:customViewController animated:YES];
[customViewController release]; // Balance out pushViewController's retain. ---->NO
}

Последний release является дополнительным, который не нужен.
Вы уже сделали autorelease, чтобы уменьшить его на 1005 *.


Мы проанализируем эту строку

self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease];

вы создаете CustomViewController счет сохранения == 1.
Вы говорите autorelease, так что счетчик будет 0 позже (вероятно, конец цикла выполнения), но сейчас это все еще 1, поэтому у вас все еще есть доступ к нему, но обработайте его как 0.
После этого вы говорите self.customViewController, что свойство сохраняется, поэтому оставьте счет == 1. И ты позаботишься об этом 1 в твоей сделке.
На ваш комментарий:

// Сбалансировать удержание pushViewController.

Вы не Balance те, вы балансируете только один YOU own. Если система сохранит ваши объекты, она освободит их, когда они больше не нужны.

1 голос
/ 27 декабря 2011

Не выпускайте customViewController.Вы уже автоматически выпустили его, когда назначили, поэтому вы уже отказались от владения alloc.Вам не нужно снова отпускать или автоматически освобождать объект.Навигационный контроллер вступает во владение и откажется от него самостоятельно в соответствующее время.

Кроме того, это совпадение, что вы можете увидеть его в одной версии, а не в другой.Это проблема управления памятью, поэтому любое повреждение, которое вы можете увидеть (сбои и т. Д.), Будет зависеть от состояния памяти на устройстве при каждом запуске приложения.Вы можете видеть сбой все время, никогда или только после запуска Skype, но до открытия приложения Photos.

Хороший способ найти это - включить зомби во время сеансов отладки.С включенными зомби объекты никогда не выпускаются.Вместо этого они переводятся в состояние зомби, и если им когда-нибудь снова отправят сообщение, они прервут приложение и покажут вам, куда было отправлено случайное сообщение, чтобы помочь отладить проблемы с памятью.

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