Возможно, проблема утечки памяти в приложении Adobe Air 3 для iOS связана с классом getDefinitionByName - PullRequest
1 голос
/ 15 октября 2011

Я разрабатываю приложение с Adobe Air 3 для IOS и часто с низкими ошибками памяти.После обновления ios 5 операционная система начала убивать мое приложение после некоторых предупреждений о нехватке памяти.

Но дело в том, что профилировщик говорит, что приложение использует от 4 до 9 мегабайт памяти.Существует много операций копирования растровых изображений, а иногда создаются новые растровые изображения из встроенных растровых изображений.Я высоко оптимизировал все и ищу утечки и т.д.все выглядит отлично, но приложение продолжает получать ошибки памяти и убивает ОС.

Есть ли что-то не так с этим кодом ниже.Поскольку я предполагаю, что этот ClassReference никогда не выходит из памяти, даже профили говорят, что память очищена.Я использовал метод клона, чтобы передать значение вместо передачи по ссылке.поэтому я думаю, что GC может собрать эту локальную переменную.Я пробовал с клоном и без него ничего не изменилось.

Если приведенный ниже код запускается 10-15 раз с ошибками приложения с другим идентификатором плитки, но с одинаковыми идентификаторами, он продолжает работать.

Есть кто-нибудь, кто знакомс такими вещами?

tmp - это bitmapData

if (isMoving)
{
tmp=getProxyImage(x,y); //low resolution tile image
}
else
{
strTmp="main_TILE"+getTileID(x,y);
var ClassReference:Class =  getDefinitionByName(strTmp) as Class; //full resolution tile image //something wrong here 
tmp=new ClassReference().bitmapData.clone(); //something wrong here
ClassReference=null;
}
return tmp.clone();

Спасибо за чтение.Я надеюсь, что у кого-то есть решение для этого.

1 Ответ

1 голос
/ 15 октября 2011

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

(Здесь я предполагаю, что вы внедрили свои растровые данные с помощью тега [Embed])

tmp = new ClassReference()

// allocates no new memory, class reference already exists
var ClassReference:Class =  getDefinitionByName(strTmp) as Class;

// creates a new BitmapAsset from the class reference including it's BitmapData.
// then you clone this bitmapdata, giving you two
tmp = new ClassReference().bitmapData.clone();

// not really necessary since ClassReference goes out of scope anyway, but no harm done
ClassReference=null;

// Makes a third copy of your second copy and returns it.
return tmp.clone();

Я бы порекомендовал это (при условии, что вам нужны уникальные растровые данные для каждой плитки)

var ClassReference:Class =  getDefinitionByName(strTmp) as Class;
return new ClassReference().bitmapData.clone();

Если вам не нужны уникальные bitmapDatas, сохраните статические свойства с bitmapDatas для некоторого класса и используйте одни и те же. Это сведет к минимуму использование памяти.

...