发送到已释放实例的释放消息,但实例指针不是nil



下面是我的一个方法中的代码,其中imageRaw是一个变量:

if (imageRaw) 
    [imageRaw release]; // error occurs here
    .
    .
    .
if (anImage) 
    imageRaw = [[anImage scaleToFitWithin:maxImageSize interpolationQuality:kCGInterpolationHigh] retain];          

我偶尔会有这种类型的错误,我真的不明白它。它非nil的唯一方式是通过赋值给正确类的实例UIImage。

启用僵尸。

在这种情况下,我所要做的就是使现有的实例被释放,这样我就可以实例化并分配/保留一个新的指针。

我猜这里发生的事情是,在你执行的某个时候,当你有东西存储在imageRaw中,但在anImage中没有任何东西时,这个方法被调用。在这种情况下,你的对象在imageRaw将被释放,但没有新的将被存储到它。这将为imageRaw中被释放的对象留下内存地址,但是该对象不再存在。然后,下次运行该方法时,它检查imageRaw是否为非nil(它是,因为它仍然持有该内存地址),并尝试在该内存上调用release,结果失败。为了避免这种情况,您可以确保在每次调用release时将imageRaw设置为nil:

if (imageRaw)
    [imageRaw release];
    imageRaw = nil;
    .
    .
    .
if (anImage)
    imageRaw = . . .

最新更新