UINavigationController: освобождает память ViewController при извлечении - PullRequest
0 голосов
/ 20 октября 2011

Я видел несколько постов на эту тему здесь, на SO, но нет однозначных ответов. Вот моя проблема.

У меня есть UINavigationController, который я использую в качестве галереи. На первом контроллере я загружаю кучу удаленных образов. Это увеличивает объем моей памяти, но не так сильно. При нажатии на изображение оно будет нажимать на другое viewController, в котором только что щелкнули изображения для галереи. Это может привести к загрузке еще 1 МБ или более данных из этих изображений.

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

Можно ли как-нибудь освободить эту память, когда я выскакиваю viewController? Возможно, по моему viewDidDisappear: методу? Если так, что бы я выпустил? И как я могу создать его снова? Я пытался это до такой степени, как, например, освобождение моего взгляда, но я получаю сбои.

Любое понимание этого вопроса?

PhotosGalleryiPad *gallery = [[PhotosGalleryiPad alloc] init];
gallery.items = self.items;
gallery.asset = self.currentAsset;
[self.navigationController pushViewController:gallery animated:YES];
[gallery release];

Ответы [ 3 ]

0 голосов
/ 20 октября 2011

Обычно вы освобождаете любую память в методе dealloc контроллера представления, который извлекается из стека.

Однако, если вы говорите об изображениях и загружаете их с [UIImage imageNamed:], тогда UIKitможет их кешировать.Попробуйте подделать предупреждение памяти в симуляторе (из меню «Оборудование») и посмотрите, выгружает ли оно эти кэшированные изображения.

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

0 голосов
/ 20 октября 2011

Где именно вы храните эти изображения галереи?

Позвольте мне предположить, что gallery.items является изменяемой коллекцией (возможно, массивом), содержащей изображения.Когда пользователь посещает новые галереи, в этот массив добавляется больше изображений.От контроллера представления к контроллеру представления вы передаете указатель на этот массив:

gallery.items = self.items;

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

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

gallery.items = [self.items mutableCopyWithZone:nil];

Затем, когда контроллер представления выталкивается, его массив items освобождается.Объекты, добавленные вытесненным контроллером представления, освобождаются, но старые объекты все еще сохраняются в массиве items предыдущего контроллера представления.

(Я просто предполагаю.было бы полезно, если бы вы объяснили, где храните эти изображения.)

0 голосов
/ 20 октября 2011

Если вы «выскальзываете» из вида на передний план, как это:

infoScreen = [[[infoScreen alloc] initWithNibName:@"InfoScreen" bundle:nil] autorelease];
infoScreen.view.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);
[self.view sendSubviewToBack:self.view];

Тогда вы сделаете [infoScreen release];, чтобы освободить / освободить вид из памяти.или retain (есть и другие ситуации, но я их забываю): release.

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