我正在追查一个奇怪的错误。该错误表现在控制台日志中显示此消息:
BlurApp(5018,0xa00d6500) malloc: *** error for object 0x103b000: pointer being freed was not allocated
执行离开事件循环后弹出此消息。当自动释放池被耗尽时,似乎正在发生这种情况。以下是似乎触发错误的代码:
- (UIImage*)imageWithImage:(UIImage*)image
scaledToSize:(CGSize)newSize;
{
UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
我用这种方式调用imageWithImage:
UIImage* theImage = [self imageWithImage:origImage scaledToSize:rect.size];
在调用例程中使用了图像,然后我假设自动释放将处理它。
如果我将return newImage;
更改为返回[newImage retain];
,则不会显示错误消息。
现在,这是非常奇怪的。只有某些大小的newSize才会出现此错误。具体来说,当newSize的高度和宽度等于55到176范围内的任何数字(56,110,112,114除外),而不是其他高度和宽度值介于5和300之间时,它总会发生。(高度和宽度是所有测试总是相等的)
我可以用一些新鲜的眼睛......谢谢!
答案 0 :(得分:0)
在调用例程中使用了图像,然后我假设自动释放将处理它。
如果我改变了返回的newImage;返回[newImage retain];找不到错误消息。
现在,这是非常奇怪的。只有某些大小的newSize才会出现此错误。
在垃圾收集语言中,只要不再引用该对象,垃圾收集器就可以清除(释放)对象。为了提高性能,可能会延迟垃圾收集 - 即直到有空闲时间,已经过了一定时间,或者直到内存条件达到某个阈值。
因此,某些对象可能会立即释放,其他对象可能会在以后释放或从未释放(直到环境关闭)。
答案 1 :(得分:0)
尝试打印从UIGraphicsGetImageFromCurrentImageContext返回的图像的retainCount。
类似于:NSLog(@“图像保留计数:%u”,[newImage retainCount]);
或在代码上放置断点并在gdb控制台上键入以下内容:
print(int)[newImage retainCount]
retainCount应该大于零,可能是一个。逐步执行代码并继续检查retainCount以查看它何时达到零。
有一个类似的主题: iPhone development: pointer being freed was not allocated