不会与CFRelease一起运行,但僵尸没有它

时间:2012-01-31 17:33:21

标签: iphone ios ipad cgimage

在此代码中:

            url = [NSURL fileURLWithPath:t.exportedFullName];

            myImageDest = CGImageDestinationCreateWithURL((CFURLRef)url, (CFStringRef)t.asset.defaultRepresentation.UTI, 1, nil);

            if(!myImageDest) {
                NSLog(@"***Could not create image destination ***");
            }
            inImage = t.asset.defaultRepresentation.fullResolutionImage;

            CGImageDestinationAddImage(myImageDest, inImage, (CFDictionaryRef)t.freshMetaData);
            success = CGImageDestinationFinalize(myImageDest);
            if(!success)
                NSLog(@"***Could not create data from image destination ***");

            [url release];
            CGImageRelease(inImage);
            CFRelease(myImageDest);

如果我不使用CFRelease(myImageDest),它会循环遍历图像信息数组(t);我得到低内存警告,应用程序最终死亡(在设备上运行时)。

如果我使用它,我会得到:

- [Not A Type _cfTypeID]:发送到解除分配的实例的消息

并且在仪器中使用Zombies进行分析显示[UIImage dealloc],其refcnt为-1​​,并且在其上方的行上显示了CFRelease,其上面的refcnt为0。显示的CFRelease是班上唯一的一个。

不能忍受它,不能没有... makin'我疯了......

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

违规行是:

 CGImageRelease(inImage);

这不应该是必需的,因为defaultRepresentation.fullResolutionImage不会增加返回的CGImage的保留计数。

此外,出于同样的原因,不需要[url release]

答案 1 :(得分:0)

url = [NSURL fileURLWithPath:t.exportedFullName];

然后再

[url release];

现在这很糟糕。你没有-alloc / -init,-copy,-mutableCopy和-retain url,所以你不拥有它。这意味着,释放它会导致NSURL实例过度发布。因此,可能是您的CGImageRef在内存中占据一席之地,然后......

删除该版本以及CFRelease()函数调用。出于同样的原因,这是不必要的。