首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未释放CGContextDrawImage内存

未释放CGContextDrawImage内存
EN

Stack Overflow用户
提问于 2012-12-12 16:20:19
回答 1查看 801关注 0票数 2

我正在使用PhotoScrollerNetwork project为我的项目中的一个视图提供一个高分辨率的图像,并自动平铺它,以便正确地管理内存。它使用这段代码将完整的高分辨率图像绘制到内存中,以便可以从中计算出平铺。

代码语言:javascript
运行
复制
-(void)drawImage:(CGImageRef)image {
       madvise(ims[0].map.addr, ims[0].map.mappedSize - ims[0].map.emptyTileRowSize, MADV_SEQUENTIAL);

       unsigned char *addr = ims[0].map.addr + ims[0].map.col0offset + ims[0].map.row0offset * ims[0].map.bytesPerRow;
       CGContextRef context = CGBitmapContextCreate(addr, ims[0].map.width, ims[0].map.height, bitsPerComponent, ims[0].map.bytesPerRow, colorSpace, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little);
       assert(context);
       CGContextSetBlendMode(context, kCGBlendModeCopy); // Apple uses this in QA1708
       CGRect rect = CGRectMake(0, 0, ims[0].map.width, ims[0].map.height);
       CGContextDrawImage(context, rect, image);
       CGContextRelease(context);

       madvise(ims[0].map.addr, ims[0].map.mappedSize - ims[0].map.emptyTileRowSize, MADV_FREE);
 }

在类的dealloc方法中,In是释放的( 'free( ims )'),所以这应该得到正确的处理。但是,如果我重复创建一个新视图(从而调用drawImage),我的内存就会被填满。我发现如果我评论CGContextDrawImage(context, rect, image);,内存是正常的,所以我认为有一些东西保存在内存中,但我不能得到什么……dealloc方法总是被调用,所以这不是问题所在。

编辑:我的图片也被正常发布了,这是完整的流程:

代码语言:javascript
运行
复制
- (void)myFunc {
        CFDictionaryRef options = [self createOptions];
        CGImageRef image = CGImageSourceCreateImageAtIndex(imageSourcRef, 0, options);
        CFRelease(options);
        CFRelease(imageSourcRef);
        if (image) {
            [self decodeImage:image];
            CGImageRelease(image);
        }
}

- (void)decodeImage:(CGImageRef)image {
    assert(decoder == cgimageDecoder);

    size_t width = CGImageGetWidth(image);
    size_t height = CGImageGetHeight(image);

#if LEVELS_INIT == 0
    zoomLevels = [self zoomLevelsForSize:CGSizeMake(width, height)];
    ims = calloc(zoomLevels, sizeof(imageMemory));
#endif

    [self mapMemoryForIndex:0 width:width height:height];

    [self drawImage:image];
    [self createLevelsAndTile];
}
EN

回答 1

Stack Overflow用户

发布于 2013-10-04 21:44:09

同时运行本地捆绑映像和网络映像,似乎没有任何重大泄漏。这与iOS7和Xcode5有关。

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

https://stackoverflow.com/questions/13835534

复制
相关文章

相似问题

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