У меня есть метод, который должен проанализировать через набор больших изображений PNG попиксельно (PNGs составляют 600x600 пикселей каждый). Это, кажется, работает отлично на Средстве моделирования, но на устройстве (iPad), я получаю EXC_BAD_ACCESS в некоторой функции копирования внутренней памяти. Кажется, что размер является преступником, потому что, если я пробую его на меньших изображениях, все, кажется, работает. Вот связанная с памятью суть метода ниже.
+ (CGRect) getAlphaBoundsForUImage: (UIImage*) image
{
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = malloc(height * width * 4);
memset(rawData,0,height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);
/* non-memory related stuff */
free(rawData);
Когда я выполняю это на наборе изображений, он работает 12 раз и затем гадит, в то время как на средстве моделирования он не выполняет проблемы. Вы у парней есть какие-либо идеи?
Я использовал степень двойного размера выровненной строки в приложении, которое напрямую определяло размер строки, когда я создавал изображения программно. Но я бы также рекомендовал toastie попробовать CGImageGetBytesPerRow, прежде чем попробовать мое предложение.
Я получал подобный сбой на своем iPad (iPhoneOS 3.2, конечно), используя CGImageCreate(). Увидев вашу проблему, я получил подсказку. Я решил проблему, выровняв мой bytesPerRow по следующей наибольшей мощности 2.
size_t bytesPerRowPower2 = (size_t) round( pow( 2.0, trunc( log((double) bytesPerRow) / log(2.0) ) + 1.0 ) );
Сообщите нам, если выравнивание строк по мощности 2 также решит вашу проблему. Вам нужно будет выделить *rawData со скорректированным размером и передать bytesPerRowPower2 в CGBitmapContextCreate()... Высота, похоже, не нуждается в выравнивании.
Возможно, CGImageGetBytesPerRow (сила два звучит чрезмерно).