2011-01-25 8 views
0

インクリメンタル描画の問題を解決するためのhotpaw2に感謝します。悲しいかな、私はそれを実装したときに解決策の問題を発見しました。 iphoneの底にあるボトルトンを押してアプリを一時停止し、それを再起動すると、それはメモリに起因するクラッシュとして現れます。 (私はこれをしない限り、私は無期限にアプリケーションを実行することができます)。実装においてCALayerでクラッシュ、メモリの問題

@private 

NSTimer* timer; 
CALayer *backingLayer; 

:私はインスタンス変数としてバッキング層を宣言したFooBarの界面において

- (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の、のUIViewのサブクラスで発生以下に示す線、で発生します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); 

私はがあることも言うべき私はこのアプリで楽器を実行した

- (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++; 
    } 
} 

:12回秒以下tick方法オフinitWithFrame火災で定義されている3210。メモリリークは検出されません。しかし、私がアロケーションを実行し、(a)物理的なボタンでアプリケーションを一時停止すると、(b)アプリケーションアイコンをタッチして再度実行すると、割り当ての巨大なクラスタ(〜2 GB)とクラッシュが表示されます。

- ジム

+0

私はこれを修正しました。アプリケーションが休止状態になるとFALSEに設定されるように、UIViewクラスにブーリアン変数 'running'があり、アクティブになるとTRUEに設定されます。 'tick'メソッドの変数' running'は 'setNeedsDisplay'が呼ばれるかどうかを決定します。 ( 'tick 'を呼び出すタイマーも無効にする必要があります)。 申し訳ありませんが、これを回答としてマークする方法を知らないでください。 –

答えて

0

最後のコメントを参照してください。アプリが非アクティブ状態になったときにBOOL runningをFALSEに設定し、再びアクティブになったときにTRUEにリセットすることでこれを修正しました。