UIScrollViewの中に配置したUIViewのバッキングレイヤーとしてCATiledLayerを使用しています。私のビューのinitメソッドで私は単純な線を描画するCGPathRefオブジェクトを作成しています。 drawLayer:inContext内にこのパスを描画しようとすると、スクロール/ズームしているときにEXEC_BAD_ACCESS(まれに)でクラッシュすることがあります。事前に準備したCGPathを描画するときにCATiledLayerがクラッシュする
コードは、私が唯一の標準的なCG *関数を使用しています、非常に簡単です:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
tiledLayer.levelsOfDetail = 10;
tiledLayer.levelsOfDetailBias = 5;
tiledLayer.tileSize = CGSizeMake(512.0, 512.0);
CGMutablePathRef mutablePath = CGPathCreateMutable();
CGPathMoveToPoint(mutablePath, nil, 0, 0);
CGPathAddLineToPoint(mutablePath, nil, 700, 700);
path = CGPathCreateCopy(mutablePath);
CGPathRelease(mutablePath);
}
return self;
}
+ (Class) layerClass {
return [CATiledLayer class];
}
- (void) drawRect:(CGRect)rect {
}
- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
CGContextSetRGBFillColor(ctx, 1, 1, 1, 1);
CGContextFillRect(ctx, self.bounds);
CGContextSetLineWidth(ctx, 5);
CGContextAddPath(ctx, path);
CGContextDrawPath(ctx, kCGPathStroke);
}
- (void)dealloc {
[super dealloc];
}
UPDATE: 私はこの問題は唯一のiOS 5上に存在することをnoicedている、それは4.3
NSZombieEnabledを有効にすると、EXEC_BAD_ACCESSをデバッグするのが簡単です。これにより、どの割り当て解除された変数が呼び出されているかが表示されます。 – Wolfert
しかし、このコードではメモリで何か悪いことはできませんが、とにかくCATiledLayerと複数のスレッドでしか起こりません。 –
これはスレッドによって共有されるクラスですか、それともすべてのスレッドに独自のインスタンスがありますか? – Wolfert