与CALayer崩溃,内存问题

时间:2011-01-25 08:07:59

标签: iphone memory crash calayer

感谢hotpaw2解决我的增量绘图问题。唉,我在实施时发现了解决方案的问题。当我按下iPhone底部的按钮暂停应用程序然后重新启动时,它会将自身显示为内存引起的崩溃。 (只要我不这样做,我就可以无限期地运行应用程序)。崩溃发生在下面的指示行,这发生在FIVBar,UIView的子类:

- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();

// @@CRASH here: Program received signal EXC_BAD_ACCESS 
[backingLayer renderInContext:ctx];     // Render the backing layer into current context
[self randomRectangle: ctx];

}

在FooBar的界面中,我已将背景层声明为实例变量:

@private

NSTimer* timer;
CALayer *backingLayer;

在FooBar的实现中,backingLayer在initWithFrame中再次出现在以下段落中:

    backingLayer = self.layer; 
    // [backingLayer retain];
    // Set its color space and background color
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGFloat components[4] = {0.0f, 0.0f, 0.0f, 1.0f};
    CGColorRef bgColor = CGColorCreate(colorSpace, components);
    backingLayer.backgroundColor = bgColor;
    CGColorRelease(bgColor);
    CGColorSpaceRelease(colorSpace);

我还应该说,NSTimer timer中定义的initWithFrame会在每秒12次以下的tick方法中触发:

- (void)tick
{    
// Tell the view that it needs to re-draw itself

    if (running) {  // Go!
       //  NSLog(@"frameRate: %2.1f, frameCount: %d", frameRate, frameCount);
        [self setNeedsDisplay];
        frameCount++;
    } 
}

我在这个应用程序上运行了仪器。没有检测到内存泄漏。但是当我运行Allocations并且(a)使用物理按钮暂停应用程序时,(b)触摸应用程序图标使其再次运行,然后我看到大量的分配(~2 GB)---和CRASH。

- 吉姆

1 个答案:

答案 0 :(得分:0)

请参阅最后评论,我应该放在这里。通过在应用程序进入非活动状态时将BOOL running设置为FALSE来修复此问题,当它再次变为活动状态时将其重置为TRUE。