【问题标题】:Problem with sprite sheet精灵表的问题
【发布时间】:2023-04-06 10:41:02
【问题描述】:

下面的代码显示了我是如何剪切精灵的,但内存使用量不断增长。我该如何解决?

CGImageRef imgRef = [imgSprite CGImage];
[imgView setImage:[UIImage imageWithCGImage:CGImageCreateWithImageInRect(imgRef, CGRectMake(column*width, line, width, height))]];
CGImageRelease(imgRef);

此代码由 NSTimer 以 0.1 的间隔调用。

【问题讨论】:

    标签: objective-c cocoa-touch memory-management uiimage


    【解决方案1】:

    由于您尚未发布 imgSprite 的声明,我假设它的类遵循 Cocoa 命名约定。

    在:

    CGImageRef imgRef = [imgSprite CGImage];
    

    该方法(非 NARC1 方法)返回您拥有的对象,因此您不应释放它。

    在:

    [imgView setImage:[UIImage imageWithCGImage:CGImageCreateWithImageInRect(imgRef, CGRectMake(column*width, line, width, height))]];
    

    参数是表达式:

    CGImageCreateWithImageInRect(imgRef, CGRectMake(column*width, line, width, height))
    

    CGImageCreateWithImageInRect()(名称遵循创建规则2的函数)返回您确实拥有的图像,因此您应该释放它,你没有。

    在:

    CGImageRelease(imgRef);
    

    您发布的图片不是您拥有的,因此您不应发布它。

    你有两个问题:你(可能过度)释放imgRef,并且你正在泄露CGImageCreateWithImageInRect()返回的图像。

    您应该改为:

    // you do not own imgRef, hence you shouldn’t release it
    CGImageRef imgRef = [imgSprite CGImage];
    
    // use a variable for the return value of CGImageCreateWithImageInRect()
    // because you own the return value, hence you should release it later
    CGImageRef imgInRect = CGImageCreateWithImageInRect(imgRef, CGRectMake(column*width, line, width, height));
    
    [imgView setImage:[UIImage imageWithCGImage:imgInRect]];
    
    CGImageRelease(imgInRect);
    

    您可能想阅读Memory Management Programming GuideMemory Management Programming Guide for Core Foundation

    1NARC = 新建、分配、保留、复制

    2Create Rule 声明如果您调用名称包含 Create 或 Copy 的函数,则您拥有返回值,因此您应该在不再需要它时释放它。

    【讨论】:

      猜你喜欢
      • 2012-08-07
      • 1970-01-01
      • 2015-04-18
      • 2019-07-09
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多