私の UIView には、NSArray (availablePaths) に格納された CGPath がいくつかあります。
何かを描画する前に、各 CGPath のスケーリングされたバージョンを作成し、配列内の古いものを置き換えます。
次のコードを使用して、drawRect で SIGABRT を取得します。
- (void) scaleAllPaths: (CGFloat) scaleFactor
{
CGAffineTransform transform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);
CFIndex i;
for(i=0;i<[availablePaths count];i++){
id obj = [availablePaths objectAtIndex:i];
CGPathRef oldPath = (CGPathRef)obj;
CGMutablePathRef newPath = CGPathCreateMutable();
CGPathAddPath(newPath, &transform, oldPath);
[availablePaths replaceObjectAtIndex:i withObject:(id) newPath];
CGPathRelease(newPath); // <--- causes SIGABRT in drawRect:
}
}
-(void)drawRect:(CGRect)rect
{
...
for (int i = 0; i < currentPathIndex; i++) {
id obj = [availablePaths objectAtIndex:i];
CGPathRef path = (CGPathRef)obj;
CGContextBeginPath(context);
CGContextAddPath(context, path); // <--- SIGABRT
CGContextDrawPath(context, kCGPathEOFill);
}
...
CGPathRelease(newPath) 描画がなくても問題なく動作しますが、もちろん、メモリ リークが発生しています。