Как освободить память в ARC для рендеринга графики с высоким использованием памяти? - PullRequest
4 голосов
/ 30 января 2012

Прежде всего, спасибо всем на этом сайте ... это было НЕВЕРОЯТНО полезно для понимания возможностей программирования на iOS.

Моя текущая проблема:

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

Размер прокси отлично работает, но когда я отображаю версию моего изображения в полном разрешении, иногда происходит сбой из-за большого использования памяти.Проблема в том, что при рендеринге мне нужно иметь несколько буферов полного разрешения (3264x2448) в памяти.Я не знаю, что или как освободить больше памяти.Я был очень осторожен с соответствием CGImageRelease везде, где я могу.

А с ARC, как узнать, действительно ли что-то было выпущено и освобождено?Установка объекта в nil на самом деле ничего не делает.

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

ЛЮБЫЕ предложения будут чрезвычайно признательны!

СПАСИБО!

Ответы [ 3 ]

8 голосов
/ 30 января 2012

ARC не имеет значения в таком контексте.

Это просто означает, что вам не нужно звонить release самостоятельно.

С не-ARC, под низким-из условия памяти, вы можете захотеть освободить некоторые свойства, которые вам на самом деле не нужны (то есть они могут быть воссозданы по требованию).

- ( void )didReceiveMemoryWarning:
{
    [ _myProperty release ];

    _myProperty = nil;

    [ super didReceiveMemoryWarning ];
}

В ARC это точно так же, кромене нужно звонить release:

- ( void )didReceiveMemoryWarning:
{
    _myProperty = nil;

    [ super didReceiveMemoryWarning ];
}

Если установить для свойства nil, то в ARC его автоматически освободят.Так что это действительно что-то делает.

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

Последний, безусловно, является проблемой ...

2 голосов
/ 30 января 2012

Так как было предложено (но не указано явно) - это не проблема ARC.

Вам понадобится 30 МБ памяти для хранения одного изображенияв памяти этого разрешения (3264x2448, при условии 32 бит на пиксель).И хотя вы не говорите, сколько буферов такого размера вам нужно в памяти, похоже, что по крайней мере их три - у вас практически нет предела памяти для многих устройств iOS (оригинальные iPad и iPhone 3GS имеют только 256 МБ всего . Из этого у вас может быть доступ только к третьему. Память, доступная вашему приложению, очень изменчива.* и retain операторы при компиляции.Если вы правильно структурировали свой код, ваши изображения будут выпущены, когда они больше не нужны.Я сильно подозреваю, что если вы отключите ARC (что вы можете сделать для каждого файла отдельно, используя флаг компилятора), вы увидите те же результаты.это мозаика вашего изображения, и работать над небольшим образцом за один раз.Если ваш алгоритм размытия не может справиться с этим, то сложная правда в том, что вам, вероятно, придется написать такой, который делает!

0 голосов
/ 30 января 2012

Вы должны выложить свое изображение и работать только над его частями одновременно. Вы можете сделать это, создав свой CIImage и затем позвонив:

[myContext drawImage:myImage atPoint:P fromRect:tileBounds];

в цикле и изменение P и tileBounds так, чтобы в конечном итоге оно охватывало всю область выходного изображения.

...