2011-12-29 2 views
2

Я получаю сообщение об ошибке EXC_BAD_ACCESS на линии CGContextClearRect(c, self.view.bounds) ниже. Я не могу понять, почему. Это в классе UIViewController. Вот функция, в которой я во время аварии.Плохой доступ на CGContextClearRect

- (void)level0Func { 
printf("level0Func\n"); 
frameStart = [NSDate date]; 

UIImage *img; 
CGContextRef c = startContext(self.view.bounds.size); 
printf("address of context: %x\n", c); 
/* drawing/updating code */ { 
    CGContextClearRect(c, self.view.bounds); // crash occurs here 
    CGContextSetFillColorWithColor(c, [UIColor greenColor].CGColor); 
    CGContextFillRect(c, self.view.bounds); 

    CGImageRef cgImg = CGBitmapContextCreateImage(c); 
    img = [UIImage imageWithCGImage:cgImg]; // this sets the image to be passed to the view for drawing 
    // CGImageRelease(cgImg); 
} 
endContext(c); 


} 

Вот мой startContext() и endContext():

CGContextRef createContext(int width, int height) { 
CGContextRef r = NULL; 
CGColorSpaceRef colorSpace; 
void *bitmapData; 
int byteCount; 
int bytesPerRow; 

bytesPerRow = width * 4; 
byteCount = width * height; 

colorSpace = CGColorSpaceCreateDeviceRGB(); 
printf("allocating %i bytes for bitmap data\n", byteCount); 
bitmapData = malloc(byteCount); 

if (bitmapData == NULL) { 
    fprintf(stderr, "could not allocate memory when creating context"); 
    //free(bitmapData); 
    CGColorSpaceRelease(colorSpace); 
    return NULL; 
} 

r = CGBitmapContextCreate(bitmapData, width, height, 8, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); 
CGColorSpaceRelease(colorSpace); 

return r; 
} 

CGContextRef startContext(CGSize size) { 
    CGContextRef r = createContext(size.width, size.height); 
    // UIGraphicsPushContext(r); wait a second, we dont need to push anything b/c we can draw to an offscreen context 
    return r; 
} 

void endContext(CGContextRef c) { 
    free(CGBitmapContextGetData(c)); 
    CGContextRelease(c); 
} 

То, что я в основном пытаюсь сделать, это привлечь к контексту, что я не толкающему на стек, так что я могу создать Из этого выйдет. Вот мой вывод:

wait_fences: failed to receive reply: 10004003 
level0Func 
allocating 153600 bytes for bitmap data 
address of context: 68a7ce0 

Любая помощь будет оценена. Я в тупике.

ответ

4

Вы не выделяете достаточное количество памяти. Вот соответствующие строки кода:

bytesPerRow = width * 4; 
byteCount = width * height; 
bitmapData = malloc(byteCount); 

Когда вы вычисляете bytesPerRow, вы (правильно) умножить ширину на 4, потому что каждый пиксель требуется 4 байта. Но когда вы вычисляете byteCount, вы делаете не умножить на 4, поэтому вы действуете так, как будто для каждого пикселя требуется только 1 байт.

Изменить его к этому:

bytesPerRow = width * 4; 
byteCount = bytesPerRow * height; 
bitmapData = malloc(byteCount); 

ИЛИ, не выделяют какой-либо памяти и Quartz выделит необходимое количество для вас, и бесплатно для Вас. Просто передайте NULL в качестве первого аргумента CGBitmapContextCreate:

r = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); 
+0

Что я буду делать без тебя? – Relish

0

Убедитесь, что значения для self.view.bounds.size действительны. Этот метод можно вызвать до того, как размер представления будет правильно настроен.

+0

Я думал, что в первый тоже, но это закончилось тем, что было действительным, и грабят нашел то, что я делаю неправильно. – Relish

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