У меня есть приложение с несколькими подклассами UIView, которое действует как страницы для UIScrollView. UIViews перемещаются вперед и назад, чтобы обеспечить беспроблемное взаимодействие с пользователем. Поскольку содержимое представлений отрисовывается довольно медленно, оно отображается на одном общем CGBitmapContext, охраняемом блокировками подклассами NSOperation - выполняется по одному сразу в NSOperationQueue - упаковывается в UIImage и затем используется основным потоком для обновления содержимого просмотров.
-(void)main {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init];
if([self isCancelled]) {
return;
}
if(nil == data) {
return;
}
// Buffer is the shared instance of a CG Bitmap Context wrapper class
// data is a dictionary
CGImageRef img = [buffer imageCreateWithData:data];
UIImage * image = [[UIImage alloc]initWithCGImage:img];
CGImageRelease(img);
if([self isCancelled]) {
[image release];
return;
}
NSDictionary * result = [[NSDictionary alloc]initWithObjectsAndKeys:image,@"image",id,@"id",nil];
// target is the instance of the UIView subclass that will use
// the image
[target performSelectorOnMainThread:@selector(updateContentWithData:) withObject:result waitUntilDone:NO];
[result release];
[image release];
[pool release];
}
UpdateContentWithData: подкласса UIView, выполняемого в основном потоке, так же просто
-(void)updateContentWithData:(NSDictionary *)someData {
NSDictionary * data = [someData retain];
if([[data valueForKey:@"id"]isEqualToString:[self pendingRequestId]]) {
UIImage * image = [data valueForKey:@"image"];
[self setCurrentImage:image];
[self setNeedsDisplay];
}
// If the image has not been retained, it should be released together
// with the dictionary retaining it
[data release];
}
Метод drawLayer: inContext: подкласса просто получит CGImage из UIImage и использует его для обновления слоя поддержки или его части. В этом процессе не участвуют ни удержание, ни выпуск.
Проблема в том, что через некоторое время у меня заканчивается память. Количество UIViews статично. CGImageRef и UIImage создаются, сохраняются и выпускаются правильно (по крайней мере, мне так кажется). Инструменты не показывают утечек, просто объем доступной свободной памяти постоянно падает, несколько раз увеличивается, а затем падает еще ниже, пока приложение не будет завершено. Приложение циклически просматривает около 2-300 из вышеупомянутых страниц до этого, но я ожидал, что использование памяти достигнет более или менее стабильного уровня используемой памяти после того, как группа страниц уже была просмотрена на высокой скорости или, поскольку изображения имеют размер до 3 МБ, которые истощаются раньше.
Любое предложение будет принято с благодарностью.