Что происходит с памятью, когда я это делаю? - PullRequest
0 голосов
/ 28 августа 2009

Я пытаюсь выяснить, как передать UIImage между различными контроллерами представления, не дублируя UIImage и не увеличивая объем памяти без необходимости. Изображение передается успешно, используя метод, описанный ниже, но я не могу освободить этот UIImage позже, что в итоге приводит к тому, что мое приложение отягощает 7 МБ + данных, которые не могут быть учтены. Я хочу знать, что происходит с памятью, когда я передаю UIImage (принадлежащий моему текущему контроллеру представления) контроллеру представления, на который я буду переключаться, а затем освобождаю исходный указатель? Как это:

-(IBAction)startEditing:(id)sender
{

    EditViewController *controller = [[EditViewController alloc] initWithNibName:@"EditViewController" bundle:nil];
    controller.delegate = self;

            //imageDataPhoto1 is of type UIImage (from camera)
            controller.editPhotoData1 = imageDataPhoto1;
            [imageDataPhoto1 release];
            imageDataPhoto1 = nil;

        controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:controller animated:YES];

    [controller release];

}

ДАННЫЕ указателя imageDataPhoto1 не освобождаются из-за того, что они были назначены экземпляру контроллера представления перед его освобождением?

Ответы [ 2 ]

2 голосов
/ 28 августа 2009

Если ваш EditViewController файл .h объявляет editPhotoData1 @property с retain, то он автоматически сохраняет любой объект, назначенный ему. Вам нужно будет release явно указать объект, по крайней мере, в методе EditViewController dealloc.

Как само собой разумеющееся, вы должны убедиться, что release любые свойства установлены для сохранения в вашем методе dealloc, для всех классов, т.е.

- (void)dealloc
{
    [editPhotoData1 release];
    ...
    [super dealloc];
}
1 голос
/ 28 августа 2009

Читать на UIImage. Он выполняет много операций кэширования и перезагрузки за кулисами, особенно если он получает изображения из именованного файла или пути. Я не думаю, что дублирование экземпляра фактически создает вторую копию. Смотрите описание + imageNamed и других, чтобы понять, о чем я говорю:

imageNamed:

Возвращает связанный объект изображения с указанным именем файла.

  • (UIImage *) imageNamed: (NSString *) name

Параметры

name Имя файла, включая его расширение имени файла. Если это в первый раз изображение загружается, метод ищет изображение с указанное имя в приложении основной комплект.

Возвращаемое значение

Объект изображения для указанного файл, или ноль, если метод не мог найти указанное изображение.

Обсуждение

Этот метод ищет в системных кешах для объекта изображения с указанным имя и возвращает этот объект, если он существует. Если соответствующий объект изображения нет уже в кеше, этот метод загружает данные изображения из указанный файл, кэширует его, а затем возвращает полученный объект.

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