查询“CGImageCreateWithImageInRect”

时间:2009-03-16 13:50:10

标签: iphone objective-c cocoa

我试图剪切图像并将其屏蔽......我能够成功完成..但程序在几分钟后以101状态退出

- (void) maskImage {

        if(scopeOn==1){

    UIGraphicsBeginImageContext(self.bounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    cachedImage=[UIImage imageNamed:@"loop.png"];
    cachedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

     imageRef = [cachedImage CGImage];

     subImage = CGImageCreateWithImageInRect(imageRef, CGRectMake(scopeLoc.x-25, scopeLoc.y-25, 50, 50));
     xMaskedImage = CGImageCreateWithMask(subImage, mask);
    zoomImg.image = [UIImage imageWithCGImage:xMaskedImage]; // retImage;
    [zoomImg setCenter:scopeLoc];

    [self addSubview:zoomImg];

    CGImageRelease(subImage);
            CGImageRelease(xMaskedImage);

}

}

这是我正在使用的代码....因为我没有分配显式内存我的猜测是CGImageCreateWithImageInRect函数正在分配内存但它没有被释放...这个函数每隔0.1秒被调用...所以最终分配了大量的memoey(我已经在内存泄漏性能监视器中看到了这一点)

那么有没有其他方法可以实现与此功能相同的方式?

3 个答案:

答案 0 :(得分:4)

您是否稍后发布了subImage变量? CGImageCreateWithImageInRect遵循CoreFoundation中的“创建”规则,因此需要您稍后释放该变量。

答案 1 :(得分:1)

您可以通过以下

释放为subImage和xMaskedImage分配的内存
    CGImageRelease(subImage);           // Decrements the retain count of a bitmap image.
    subImage=nil;
CGImageRelease(xMaskedImage);
xMaskedImage=nil;

它肯定会解决你的问题。

答案 2 :(得分:0)

如果zoomImg已经是子视图,可能会尝试添加测试:

if (zoomImg.superview != self)
    [self addSubview:zoomImg];

虽然这是一个相当长的镜头。