我有一个代码迭代器,它是一个测试函数,用于将原始数据转换为 UIImage 对象以进行文件存储。我有两个失败路径或选项。我会失败:
A.)通过泄漏(仪器没有显示它 - 仪器所有分配似乎都是稳定的,我必须迭代多次,比如 50 次,它会通过仪器或正常运行测试功能崩溃)。由于下面的“b”选项,内存似乎是罪魁祸首。
B.)我可以在 UIImage 中强制释放 CG 对象,在这种情况下,应用程序将继续执行。一旦迭代器完成,测试将在最后一次迭代中崩溃,试图释放从我的子函数返回的图像下方的 CGImage。无论我请求多少次迭代,迭代器都会完成它的运行。这表明我已经修复了泄漏。所以现在我想一起想知道最后一次迭代有什么特别之处?(弧?)
- (UIImage *) convertRGBToUIImage:(unsigned char *) buffer
withWidth:(int) width
withHeight:(int) height
{
CGColorSpaceRef colorSpace = nil;
CGContextRef context = nil;
CGImageRef ref = nil;
UIImage *retImg = nil;
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL)
{
NSLog(@"ERROR: allocating color space convert Bitmap\n");
return nil;
}
context = CGBitmapContextCreate (buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace );
if (context == NULL)
{
NSLog(@"ERROR: Context not created!");
return nil;
}
ref = CGBitmapContextCreateImage(context);
CGContextRelease(context);
retImg = [UIImage imageWithCGImage:ref];
CGImageRelease(ref);
return retImg;
}
迭代器基础
for(int i = 0; i < numberiterations; i++)
{
UIImage *completedImage = [phelper convertRGBToUIImage:pBuffer withWidth:width withHeight:height]
//...save it out or display it
//Turn on one of the scenarios below
//scenario "A" -- will leak memory (instruments doesn't seem to turn anything up)
//ARC free
//completedImage = nil; //this will leak and fail after ~50 iterations
//-or-
//scenario "B" -- will crash on the very last iteration every time but can run x times
//CGImageRelease([completedImage CGImage];
}
Xcode 中的分析工具更喜欢上面的场景“A”。再次,我可以做到这一点,一切似乎都很好,但它不会成功完成测试。我认为这指向ARC。我试图找出 __bridge 类型转换但没有成功。我似乎无法正确使用语法,也许它不是我问题的答案。任何提示或想法将不胜感激。