首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGLayerCreateWithContext CGContext泄漏

CGLayerCreateWithContext CGContext泄漏
EN

Stack Overflow用户
提问于 2013-03-26 20:54:10
回答 1查看 904关注 0票数 2

为什么会发生这种泄漏?

我非常不喜欢问一个非常具体的问题,也不太可能帮助很多其他人,但经过几个小时的挠头,我别无选择。

泄漏工具报告说,以下代码有泄漏:

代码语言:javascript
复制
- (void)likeABarrelFullOfHoles
{
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(50.0f, 50.0f), YES, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGLayerRef *shapeLayers = malloc(3 * sizeof(*shapeLayers));

    for (int i = 0; i < 3; i++)
    {
        // Leak culprit.
        shapeLayers[i] = CGLayerCreateWithContext(context, CGSizeMake(5.0f, 5.0f), NULL);
    }

    for (int i = 0; i < 3; i++) {
        free(shapeLayers[i]);
    }
    free(shapeLayers);

    UIGraphicsEndImageContext();
}

具体来说,它报告说,CGLayerCreateWithContext函数是问题所在,但它泄漏的是CGContext对象,而不是CGLayer对象,它将返回这些对象:

我毫不怀疑,我的问题是由于对内存管理/动态分配缺乏基本的理解,而且有人会用“您应该知道这个”的方法指责我,因为下面的代码似乎没有泄漏:

代码语言:javascript
复制
- (void)noLeaks
{
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(50.0f, 50.0f), YES, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGLayerRef shapeLayer = CGLayerCreateWithContext(context, CGSizeMake(5.0f, 5.0f), NULL);
    CGLayerRelease(shapeLayer);

    UIGraphicsEndImageContext();
}

请注意,这显然是问题的最简单的再现状态。我使用动态内存分配,因为在我的实际代码中,数组的大小在编译时不知道。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-26 21:01:56

我无法告诉您,为什么仪器报告CGContext对象正在泄漏,而不是CGLayer,而是用

代码语言:javascript
复制
shapeLayers[i] = CGLayerCreateWithContext(context, CGSizeMake(5.0f, 5.0f), NULL);

一定要放出来

代码语言:javascript
复制
CGLayerRelease(shapeLayers[i]); 

而不是和

代码语言:javascript
复制
free(shapeLayers[i]);   

CGLayerCreateWithContext不是malloc,因此为该对象调用free会导致内存损坏。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15647195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档