【问题标题】:iphone . ending, closing and releasing a CGContext苹果手机 。结束、关闭和释放 CGContext
【发布时间】:2011-03-31 20:39:56
【问题描述】:

我有一种在 iPhone 上创建 PDF 的方法。

方法是这样开始的

CGContextRef pdfContext = [self createPDFContext...]
// this line creates a CGContextRef that I will use to write the page
// if not released this will leak...

// the method continues...

// at the end I have

CGContextEndPage (pdfContext);
CGPDFContextClose(pdfContext);
CGContextRelease (pdfContext);

Xcode 抱怨最后一行。如果我包含它,它会说调用者此时不拥有的对象的引用计数的递减不正确

如果我删除它说的行:在第 X 行分配的对象的潜在泄漏其中 X 是创建上下文的行...

如果我在 createPDFContext 方法上释放上下文,它会崩溃!

这里有 createPDF 方法

-(CGContextRef) createPDFContext:(CGRect)inMediaBox path:(CFStringRef) path
{
    CGContextRef myOutContext = NULL;
    CFURLRef url;
    CGDataConsumerRef dataConsumer;

    url = CFURLCreateWithFileSystemPath (NULL,  path, kCFURLPOSIXPathStyle, false);

    if (url != NULL)
    {
        dataConsumer = CGDataConsumerCreateWithURL (url);
        if (dataConsumer != NULL)
        {
            myOutContext = CGPDFContextCreate (dataConsumer, &inMediaBox, NULL);
            CGDataConsumerRelease (dataConsumer);
        }
        CFRelease(url);
    }

//  CGContextRelease(myOutContext);
    return myOutContext;
}

如何解决?

【问题讨论】:

    标签: iphone


    【解决方案1】:

    鉴于 Cocoa 内存管理规则,您的方法 createPDFContext:path: 不应返回调用者拥有的对象。规则期望方法包含“new”、“copy”、“alloc”和“mutableCopy”以返回调用者拥有的对象。您的方法返回具有 +1 保留计数的 CGContextRef。所以你释放这个方法返回的对象是正确的,但是,分析器会抱怨它,因为你的命名约定违反了规则。

    您不应该在 createPDFContext:path: 中释放上下文,因为这会阻止您使用它。

    您可以通过重命名方法或使其成为 C 函数来解决此问题。 C 函数将遵循 Core Foundation 内存管理规则,该规则期望函数名称中带有“create”或“copy”以返回调用者拥有的对象。

    【讨论】:

    • 我已将该方法命名为 myPDFContext 但我仍然在CGContextRelease 行...显然不可能解决这个问题。
    • 这并非不可能,只是您仍然没有遵循内存管理规则的命名约定。名为 myPDFContext 的方法应返回调用者不拥有的对象。由于您不应该拥有返回值,因此释放对象对分析器来说似乎是错误的。如果您将方法设为“newPDFContext:path:”或将其更改为 C 函数 CreatePDFContext(CGRect, CFStringRef),您应该摆脱警告。
    • 就是这样。显然,解决这个问题的唯一方法就是让它成为一个 C 函数。谢谢!
    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多