обнаружение двойного свободного объекта, релиз или не релиз - PullRequest
1 голос
/ 02 июня 2010

Если у нас есть этот код в нашем интерфейсе .h файл:

@interface CarModelSelectViewController : UITableViewController {

NSString *fieldNameToStoreModel;
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
DataEntered *dataEntered;


}


@property (nonatomic, retain) NSString *fieldNameToStoreModel;

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) DataEntered *dataEntered;


@end

В нашем файле реализации .m мы должны иметь:

- (void)dealloc {

[fieldNameToStoreModel release];
[fetchedResultsController release];
[managedObjectContext release];
[dataEntered release];

[super dealloc];
}

4 объекта назначены из предыдущего UIViewController, например:

UIViewController *detailViewController;

detailViewController = [[CarModelSelectViewController alloc] initWithStyle:UITableViewStylePlain];
((CarModelSelectViewController *)detailViewController).dataEntered = self.dataEntered;
((CarModelSelectViewController *)detailViewController).managedObjectContext = self.managedObjectContext;
((CarModelSelectViewController *)detailViewController).fieldNameToStoreModel = self.fieldNameToStoreModel;

[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];

Объекты, которые теперь живут в новом UIViewController, такие же, как предыдущий UIViewController, и я не могу выпустить их в новом UIViewController?

Проблема в том, что иногда мое приложение вылетает, когда я покидаю новый UIViewController и перехожу на предыдущий, не всегда. Обычно ошибка, которую я получаю - это двойной свободный объект.

Я использовал malloc_error_break, но я все еще не уверен, какой объект.

Иногда я могу перейти от предыдущего UIViewController к следующему и вернуться 4 или 5 раз, и появляется двойной свободный объект.

Если я не отпускаю какой-либо объект, все работает, и Инструменты говорят, что нет утечек памяти ...

Итак, последний вопрос, я должен выпустить эти объекты здесь или нет?

Спасибо

м.

редактирование:

fetchedResultsController.delegate всегда равен nil, так как в этом представлении извлеченные объекты не изменяются, а NSFetchedResultsControllerDelegate отсутствует в файле @interface .h.

изменить 2:

Добавлено объявление свойств файла интерфейса, извините!

Ответы [ 4 ]

2 голосов
/ 02 июня 2010

Вы правы, чтобы освободить их по вашему dealloc методу. Похоже, их куда-то выпускают. Я рекомендую вам использовать инструменты с включенным NSZombieEnabled. (Используйте инструмент «Распределение объектов», нажмите кнопку «i» и установите флажок «Включить обнаружение NSZombie». Я считаю, что для этого необходимо, чтобы вы использовали симулятор.) Когда зомби найден, вы можете отслеживать жизнь объекта точно увидеть, где он хранится и освобождается.

1 голос
/ 02 июня 2010

Если вы заботитесь об объекте, вы сохраняете его. Если вы сохраняете это, вы отпускаете это. Это все закон, остальное просто комментарий.

Скорее всего, вы неправильно объявляете свои @properties и не включаете в них атрибут "retain".

Обратите внимание, что вы должны объявить detailViewController как CarModelSelectViewController* вместо того, чтобы объявлять его как UIViewController, а затем разыгрывать его каждый раз, когда вы его используете.

Вы должны прочитать Руководство по программированию управления памятью и, в частности, Практическое управление памятью . Управление памятью какао на самом деле довольно просто. Если вы всегда используете аксессоры и изучаете три магических слова , у вас редко будут большие проблемы.

0 голосов
/ 03 июня 2010

Наконец я нашел это: -)

Как только malloc_error_break был включен, XCode остановился там, где была ошибка с адресами объекта, печать объекта в консоли дала мне точный объект, и этот объект не был в тех представлениях, которые я выпускал Таким образом, проблема была в самом первом представлении, которое вызывало мои последующие представления ...

спасибо,

С уважением,

м.

0 голосов
/ 02 июня 2010

Если вы выполняете какую-либо пользовательскую инициализацию для CarModelViewSelectController, нам было бы полезно увидеть это.

Кроме того, ваша UINavigationControllerDelegate выполняет какое-либо управление памятью?

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