Выпустить сообщение для объекта UINavigationController - PullRequest
1 голос
/ 19 июля 2010

Я относительно новичок в программировании Какао, и некоторые аспекты управления памятью все еще беспокоят меня.

В этом случае я создаю UINavigationController, используя сообщение alloc, и инициализирую его с помощью контроллера UIView.Затем я представляю представление модально, передавая его в метод presentModalViewController.Ниже приведен код:

- (void)tableView:(UITableView *)tableView 
accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Tapped on disclosure button");
NewPropertyViewController *newProperty = [[NewPropertyViewController alloc] 
                                          initWithDictionary];
newProperty.editProperty = [fetchedResultsController objectAtIndexPath:indexPath];
UINavigationController *newPropertyNavigationController = [[UINavigationController 
                                          alloc] 
                                          initWithRootViewController:newProperty];
[newProperty setPropertyDelegate:self];
[self presentModalViewController:newPropertyNavigationController animated:YES];

[newProperty release];
[newPropertyNavigationController release];
}

В соответствии с правилами сохранения количества, если я отправляю сообщение «alloc» классу, экземпляр этого класса возвращается с сохранением count 1, и я отвечаю завыпуская это.В приведенном выше коде я освобождаю экземпляр newPropertyNavigationController после передачи его в modalViewController и представления его.Когда я отклоняю модальное представление, приложение вылетает.

Если я закомментирую последнюю строку, приложение не вылетает.

Почему это происходит?Является ли конкретное сообщение alloc / init для UINavigationController работающим не так, как оно работает в других классах, т.е.возможно, он возвращает автоматически выпущенный экземпляр?

Спасибо!

Питер

Ответы [ 2 ]

2 голосов
/ 19 июля 2010

Вам нужно остановить то, что вы делаете, и прочитать это .Правила управления памятью очень просты и понятны.Пусть они сгорят в вашей голове (это не займет много времени).Затем проверяйте свой код построчно в своих проблемных местах и ​​apis, которые вызываются из вашего кода.Отслеживание кода таким образом, пока правила свежи в вашей голове, поможет вам исправить проблемы с памятью и, возможно, просто может помочь вам предотвратить их создание в будущем.

1 голос
/ 19 июля 2010

Способ создания контроллера модального вида выглядит правильно.Проверьте реализацию dealloc на ваших контроллерах модального вида, чтобы увидеть, в чем проблема.

Если вы неправильно удаляете память, это объясняет, почему вы получаете ошибку только при освобождении контроллера модального представления.

Для справки я нахожу следующее использование авто-релиза гораздо более читабельным и поддерживаемым

NewPropertyViewController *newProperty = [[[NewPropertyViewController alloc] 
                                      initWithDictionary] autorelease];
newProperty.editProperty = [fetchedResultsController objectAtIndexPath:indexPath];
UINavigationController *newPropertyNavigationController = [[[UINavigationController 
                                      alloc]
                                      initWithRootViewController:newProperty] autorelease];
[newProperty setPropertyDelegate:self];
[self presentModalViewController:newPropertyNavigationController animated:YES];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...