Прежде всего, вы теряете память, память pixelData никогда не освобождается.
Для вашего использования лучше позволить вызовам CGContext управлять памятью. Просто передайте NULL i.s.o. pixelData, и пока вы продолжаете подсчет ссылок в вашем контексте, CGBitmapContextGetData(context)
останется действительным.
Вы используете альфа, как если бы это была последняя запись (RGBA, а не ARGB), используете ее как таковую при создании контекста или адаптируете код alphaAtX
. Я не уверен, хотите ли вы умножения предварительно, если вы просто проверяете альфа-значения, вы этого не делаете.
В целом что-то вроде:
[...]
CGContextRelease(context);
context = CGBitmapContextCreate (NULL,
image.size.width,
image.size.height,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaLast
);
CGColorSpaceRelease( colorSpace );
CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
pixelData = CGBitmapContextGetData(context);
[...]
с контекстом, являющимся переменной-членом, инициализированной в NULL, уже будет шагом в правильном направлении.