Я только недавно занялся разработкой для 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.
Заранее спасибо и с наилучшими пожеланиями!