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