Я пытаюсь понять, почему 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?
Есть ли предел для рисования с CGContext (как вы написали «ограничиваете размер контекста максимальным 2048 шириной и 1024 высотой»)? Любая ссылка? – Bhushan
Нет, я придумал эти цифры, экспериментируя. – Lukasz
Я столкнулся с одной проблемой. Не могли бы вы прокомментировать это: http://stackoverflow.com/questions/22961577/what-is-the-best-way-to-show-large-uiview-on-uiscrollview – Bhushan