繁体   English   中英

不会与CFRelease一起运行,但僵尸会失去它

[英]Won't run with CFRelease but zombies with out it

在此代码中:

            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]的反射率为-1,而在其上方的一行中,该类中的CFRelease的反射率为0。 所显示的CFRelease是该类别中唯一的一种。

不能忍受,不能没有...让我疯狂...

有任何想法吗?

令人反感的行是:

 CGImageRelease(inImage);

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

同样,出于相同的原因也不需要[url release]

url = [NSURL fileURLWithPath:t.exportedFullName];

然后再

[url release];

现在不好了。 您没有-alloc / -init,-copy,-mutableCopy或-retain url ,因此您没有它。 这意味着释放它会导致NSURL实例的过度释放。 因此,您的CGImageRef可能会在内存中占据一席之地,然后...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM