2009-11-22 2 views
0

У меня есть метод для рисования объекта на экране с помощью кварца. Последние строки этого метода являются:IPHONE: память по-прежнему выделяется после отпускания объекта?

CGRect LayerRect = CGRectMake(mX,mY, wLayer, hLayer); 
CGContextDrawImage(objectContext, LayerRect, objectProxy.image.CGImage); // 1 

CGRect superRect = CGRectMake(vX, vY, w,h); 
CGContextDrawLayerInRect(context, superRect, objectLayer); 

CGLayerRelease(objectLayer); // 2 
UIImage * myImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); //3 
return myImage; 

, как Вы видите слой, нарисованные на // 1 выпущен на // 2, и контекст выпущен // 3.

Итак, утечки нет?

На самом деле, приборы сообщают об этом как о НЕ УТЕЧКЕ, но после запуска этого метода и возврата в основной цикл мое приложение использует 1.38 МБ памяти больше, чем раньше.

Исследуя на intruments, на вкладке выделения памяти, я вижу запись как

Malloc 1.38 MB 
overall bytes = 1.38 MB 
#Overall = 1 
#alloc = 
Live Bytes = 1.38 MB 
#Living = 1 
#Transitory = 0 

и это точки входа в этот

CGContextDrawImage(objectContext, LayerRect, objectProxy.image.CGImage); // 1 

Так, по-видимому, память, выделенная внутри метода еще выделяется но не утечка ?? Как это может быть?

Как я могу избавиться от этого распределения памяти, освобождая память?

благодарит заранее!

ответ

-1

, по-видимому, нет никакого решения для этого, пока Apple не исправить.

1

Изображение, безусловно, будет использовать некоторую память. Я не полностью разбираюсь в программировании на iPhone, но образ под OS X всегда является копией того, из чего вы сделали изображение. Документы говорят, что образ живет в autoreleasepool, поэтому в зависимости от того, как вы управляете пулами, он может жить там довольно долго. Вы можете попытаться поставить autoreleasepool вокруг вызова в , вызывающем функцию (помещая его в функцию te, которую вы цитируете выше, вернет недопустимый объект).

Как правило, я могу сказать, что как только авторефераты будут входить в игру, попытка отслеживания выпуска объектов станет довольно громоздкой (а иногда и невозможной) идея объектов автообновления заключается в том, что система лучше знает, когда выпустить они (что-то, что управляет программистом на C++, как я, орехи ... но, конечно, Objective C и Cocoa не делают меня счастливыми :-)))

Однако, если ваша функция выше называется drawOffline, вы должны быть в состоянии избавиться от памяти в изображении через

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
UIImage *ret= [self drawOffline]; 
// do some work using ret (possibly copying it) 
[pool release]; 
// memory should be released and the ret ptr is invalid from this point on. 

Идет немного дальше, i f вы намерены использовать ret ptr немного дольше, вы должны сохранить его, чтобы сообщить системе, что он не должен удалять его, даже если пул автозапуска освобождает его.

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
UIImage *ret= [self drawOffline]; 
[ret retain]; // prevent ret from being deleted when the pool releases it 
// do some work using ret (possibly copying it) 
[pool release]; 
// ret ptr will continue to live until you release it. 

// more stuff 

[ret release]; // image behind ret being freed 

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

Эта [ссылка] [1] описывает управление памятью под OS X, а также относится к iphone.

[1]: http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html ссылка

+0

СПАСИБО! но я пробовал это, и выделенная область все еще там! – SpaceDog

+0

, дополняющий мой последний комментарий ... Я подтвердил, что возвращенное изображение не отвечает за выделенную память. Я прокомментировал строку выше // 3 и заменил последний на return nil; и инструменты по-прежнему показывают 1,38 МБ как выделенные для CGContextDrawImage (// 1) ... потрясающие. Как-то CGContextDrawImage не освобождает выделенную область после создания изображения. – SpaceDog

+0

Да, это сумасшествие ... все, что вы можете сделать, это написать и проверить свой код и сделать все возможное, а потом надеяться, что люди в Apple также знают, что они делают. – Nicholaz

Смежные вопросы