CATextLayer остаток памяти после освобождения - PullRequest
1 голос
/ 06 марта 2011

Я только недавно занялся разработкой для iPhone, и я все еще в процессе выяснения вещей.При тестировании поведения CALayer и CATextLayer я наткнулся на кое-что интересное.

Я создал тестовое приложение для iPhone, в котором только 2 кнопки UIB в представлении.Один из них вызывает функцию allocateAutoReleasedLayers, а другой соответственно deallocateAutoReleasedLayers.Следующие фрагменты кода представляют тела функций.

-(IBAction)allocateAutoReleasedLayers:(id)sender
{
    for ( int i = 0; i < 500; ++i )
    {
        CALayer * layer = [ CALayer layer ];
        [ master addSublayer: layer ];
    }
}

-(IBAction)deallocateAutoReleasedLayers:(id)sender
{
    master.sublayers = nil;
}

Теперь цель теста состояла в том, чтобы увидеть, как iOS управляет автоматическим выпуском слоев.При запуске с анализатором Allocations приложение занимает 646,452 байта памяти.После того, как я нажал кнопку «выделение», использование памяти поднялось до 719,228 байт для размещения всех 500 созданных пустых слоев, что нормально, так как, когда я нажимаю кнопку «освобождение», используемая память возвращается к 656,732 байтам (я предполагаю, что несоответствие в памяти, используемой до выделения и после освобождения, является результатом управления внутренней памятью iOS).

Интересная часть происходит, когда я изменяю часть процедуры «выделения» вместо создания CATextLayersCALayers.

-(IBAction)allocateAutoReleasedLayers:(id)sender
{
    for ( int i = 0; i < 500; ++i )
    {
        NSString * layerString = [ [NSString alloc ] initWithFormat: @"1231" ];
        CATextLayer * textLayer = [ CATextLayer layer ];
        [ textLayer setString: layerString ];
        [ textLayer setFrame: CGRectMake( 0, 0, 100, 200) ];
        [ textLayer setFont: @"Helvetica-Bold" ];
        [ textLayer setFontSize: 20 ];
        [ master addSublayer: textLayer ];
        [ layerString release ];
    }
}

Приложение запускается с обычным использованием 651,868 байт перед выделением и увеличивается до используемых 2,13 МБ (я полагаю, что CATextLayers довольно тяжело использует память) и после освобождения памятиотступает к 950,372 байтам.

Теперь мой вопрос заключается в следующем: что вызвало разницу в 300 КБ до выделения и после освобождения при работе с CATextLayers.Я предполагаю, что моё неправильное понимание того, как iOS управляет памятью, могло быть причиной, но я использовал точно такой же способ создания CATextLayer, как и при создании CALayer.

Заранее спасибо и с наилучшими пожеланиями!

1 Ответ

2 голосов
/ 06 марта 2011

Я запустил ваш код на симуляторе и не вижу этого поведения.Вот шаги, которые я выполнил:

1) Запустите приложение под инструментом «Распределения».
2) Дождитесь его полного запуска.
3) Отметьте кучу -> Куча (0)
4) a) выделить экземпляры CATextLayer с allocateAutoReleasedLayers: b) освободить с помощью deallocateAutoReleasedLayers: c) пометить Heap -> Heap (1)

операция 4 дает нам тестовый шаблон (куча Allocate-Deallocate-Mark), так

5) ADM (2) -> куча (2)
6) ADM (3) -> куча (3)
7) ADM (4) -> куча (4))
...

Разница между кучей (n) и кучей (n-1) составляет около 2K, когда выполняется ADM (n), и уменьшается до 0,5-1k, когда ADM (n + 1)выполнено (это, вероятно, потому, что фреймворк воссоздает некоторые вещи и выпускает старую, я могу заметить это, например, для CGDataProvider).В любом случае, вещи в Heap (n + 1) -Heap (n) содержат что-то не относящееся к делу, например CSEvent, UITouchData и т. Д., Которое, скорее всего, предназначено для обработки нажатий кнопок.

Проводите ли вы тест на устройстве или симуляторе?Сколько раз вы повторяете этот цикл ADM?В чем состоит разница между последующими кучами?Это интересно, потому что 300k кажется мне слишком много.

...