使用指定大小的自动释放UIImages发生奇怪的malloc错误

时间:2009-09-29 20:42:24

标签: iphone core-graphics release

我正在追查一个奇怪的错误。该错误表现在控制台日志中显示此消息:

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之间时,它总会发生。(高度和宽度是所有测试总是相等的)

我可以用一些新鲜的眼睛......谢谢!

2 个答案:

答案 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