UINavigationViewController освобождение памяти - PullRequest
1 голос
/ 01 августа 2009

Прежде всего, я никогда не видел так много проблем с памятью в моем приложении, так как я начал помещать "себя" везде после прочтения статьи о том, как память ведет себя в obj-C. Теперь я получаю все виды проблем (показывает неряшливость моего кодирования). Конечно, я новичок в Objective-C, и я признаю, что у меня никогда в жизни не было столько проблем с управлением памятью. Но я считаю, что это требует практики, чтобы привыкнуть к этому.

Теперь перейдем к моему вопросу.

У меня есть свойство интерфейса класса (self.todoCreate), которое содержит ссылку на вышеуказанный контроллер. К этому контроллеру можно перейти, нажав кнопку.

@property (nonatomic, retain) TodoTaskCreateController *todoCreate;

Код ниже - это фрагменты, которые вызывают изменение вида навигации:

TodoTaskCreateController *viewController = [[TodoTaskCreateController alloc] 
                   initWithNibName:@"TodoTaskCreateController"
                            bundle:[NSBundle mainBundle]];

self.todoCreate = viewController;
[viewController release];
// slide-in todoCreate controller.  
if (self.navigationController != nil && self.todoCreate != nil) {
    [self.navigationController pushViewController:self.todoCreate animated:YES];
}

Итак, вот моя проблема:

При первом запуске я работаю. Когда я на втором экране просмотра, я возвращаюсь к основному виду. И если я попытаюсь снова перейти во второй раз, то приложение вылетает, именно там, где назначается self.todoCreate viewController.

Обратите внимание, что в методе viewDidAppear основного представления я вызываю [self.todoCreate release].

Может кто-нибудь объяснить это?

PS - Неудивительно, что многие приложения для iPhone случайно вылетают.

Ответы [ 2 ]

1 голос
/ 01 августа 2009

todoCreate - это свойство, которое означает, что когда вы присваиваете ему значение, оно вызывает метод с именем setTodoCreate, который выглядит примерно так:

- (void) setTodoCreate:(Foo*) newVal
{
    [todoCreate release]; // release the previous object
    todoCreate = [newVal retain]; // point to new object, and also retain it
}

Теперь ваш метод viewDidAppear освобождает self.todoCreate, и в этот момент счетчик хранения todoCreate равен 0. Когда вы создаете новый TodoTaskCreateController и назначаете его для self.todoCreate, выполняется еще один release, но на этот раз на объекте с счетом сохранения 0.

Вместо [self.todoCreate release] вы должны использовать self.todoCreate = nil.

Вы, вероятно, не должны постоянно уничтожать и создавать свой TodoTaskCreateController.

Ваш комментарий относительно сбоя приложения, скорее всего, связан с тем, что разработчики не тестируют свое приложение, чтобы увидеть, правильно ли оно обрабатывает предупреждения памяти. В симуляторе есть опция меню, чтобы симулировать это, и ваше приложение должно «пережить» предупреждение в всех своих просмотров.

0 голосов
/ 01 августа 2009

Я не собираюсь говорить с этим в ближайшее время, но, похоже, я решил проблему, просто добавив viewController в пул автоматического выпуска, а затем удалив все ручные вхождения его выпуска.

Теперь имеет значение, если мой @property для createTodo определен как (неатомный, сохраняемый), а не (неатомарный, назначить)?

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