2012-06-20 2 views
0

Я пытаюсь понять, почему iOS резко разбивает мое приложение суровым способом (без аварийных журналов, немедленный показ с черным экраном смерти со счетчиком, показанным на некоторое время). Это происходит, когда я делаю контент для CALayer с помощью Quartz. Я подозревал, что проблема с памятью (происходит только при тестировании на устройстве), но журналы памяти, а также журналы распределения устройств выглядят вполне нормально. Позвольте мне пройти в фатальной функции:Жесткий сбой при рисовании контента для CALayer с использованием кварца

- (void)renderTiles{ 

    if (rendering) { 
     //NSLog(@"====== RENDERING TILES SKIP ======="); 
     return; 
    } 
    rendering = YES; 



    CGRect b = tileLayer.bounds; 
    CGSize s = b.size; 
    CGFloat imageScale = [[UIScreen mainScreen] scale]; 
    s.height *= imageScale; 
    s.width *= imageScale; 

    dispatch_async(queue, ^{ 

     NSLog(@""); 
     NSLog(@"====== RENDERING TILES START ======="); 

     NSLog(@"1. Before creating context"); 
     report_memory(); 

     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
     NSLog(@"2. After creating color space"); 
     report_memory(); 

     NSLog(@"3. About to create context with size: %@", NSStringFromCGSize(s)); 
     CGContextRef ctx = CGBitmapContextCreate(NULL, s.width, s.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 

     NSLog(@"4. After creating context"); 
     report_memory(); 

     CGAffineTransform flipTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, s.height); 
     CGContextConcatCTM(ctx, flipTransform); 

     CGRect tileRect = CGRectMake(0, 0, tileImageScaledSize.width, tileImageScaledSize.height); 
     CGContextDrawTiledImage(ctx, tileRect, tileCGImageScaled); 

     NSLog(@"5. Before creating cgimage from context"); 
     report_memory(); 

     CGImageRef cgImage = CGBitmapContextCreateImage(ctx); 
     NSLog(@"6. After creating cgimage from context"); 
     report_memory(); 

     dispatch_sync(dispatch_get_main_queue(), ^{ 
      tileLayer.contents = (id)cgImage;   
     }); 

     NSLog(@"7. After asgning tile layer contents = cgimage"); 
     report_memory(); 

     CGColorSpaceRelease(colorSpace); 
     CGContextRelease(ctx); 
     CGImageRelease(cgImage); 

     NSLog(@"8. After releasing image and context context"); 
     report_memory(); 


     NSLog(@"====== RENDERING TILES END ======="); 
     NSLog(@""); 
     rendering = NO; 

    }); 
} 

Вот журналы:

====== RENDERING TILES START ======= 
1. Before creating context 
    Memory in use (in bytes): 28340224/519442432 (5.5%) 
2. After creating color space 
    Memory in use (in bytes): 28340224/519442432 (5.5%) 
3. About to create context with size: {6324, 5208} 
4. After creating context 
    Memory in use (in bytes): 28344320/651268096 (4.4%) 
5. Before creating cgimage from context 
    Memory in use (in bytes): 153649152/651333632 (23.6%) 
6. After creating cgimage from context 
    Memory in use (in bytes): 153649152/783159296 (19.6%) 
7. After asgning tile layer contents = cgimage 
    Memory in use (in bytes): 153653248/783253504 (19.6%) 
8. After releasing image and context context 
    Memory in use (in bytes): 21688320/651288576 (3.3%) 
====== RENDERING TILES END ======= 

аварий приложений в случайных местах. Иногда при достижении функции и иногда в случайном шаге.

В каком направлении следует искать решение? Возможно ли, что GDC вызывает проблему? Или, может быть, размер контекста или некоторые базовые ссылки Core Animation?

ответ

0

После точной отладки и экспериментирования с отображаемым размером контекста, это оказалось проблемой, связанной с памятью. Решение заключалось в том, чтобы ограничить размер контекста максимальным размером 2048 и 1024 высотой

+0

Есть ли предел для рисования с CGContext (как вы написали «ограничиваете размер контекста максимальным 2048 шириной и 1024 высотой»)? Любая ссылка? – Bhushan

+0

Нет, я придумал эти цифры, экспериментируя. – Lukasz

+0

Я столкнулся с одной проблемой. Не могли бы вы прокомментировать это: http://stackoverflow.com/questions/22961577/what-is-the-best-way-to-show-large-uiview-on-uiscrollview – Bhushan

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