0

私の 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) 描画がなくても問題なく動作しますが、もちろん、メモリ リークが発生しています。

4

2 に答える 2

1

s を:wrap insideに追加するためにここにある解決策を試してください。CGPathRefNSMutableArrayCGPathRefUIBezierPath

編集:-[UIBezierPath applyTransform:]で回避するためCGPathRefに使用できるようですscaleAllPaths:

- (void) scaleAllPaths: (CGFloat) scaleFactor
{
  CGAffineTransform transform = CGAffineTransformMakeScale(scaleFactor,scaleFactor);
  for (UIBezierPath *bezierPath in availablePaths){
    [bezierPath applyTransform:transform];
  }
}

- (void)drawRect:(CGRect)rect
{
  ...
  for (int i = 0; i < currentPathIndex; i++) {
    UIBezierPath *bezierPath = [availablePaths objectAtIndex:i];
    CGPathRef path = bezierPath.CGPath;
    CGContextBeginPath(context);
    CGContextAddPath(context, path);
    CGContextDrawPath(context, kCGPathEOFill);
  }
  ...
}
于 2013-03-15T14:20:35.263 に答える
1

別のクラスで CGPath オブジェクトを解放していたことがわかったので、次の場所に送信しました。

-(void) setPath: (CGPathRef) pathToSet forceClosed: (BOOL) fClosed
{

  if(_path){
    CGPathRelease(_path);
  }
  _path = pathToSet;
  CGPathRetain(_path);  // <--- was missing
}

ありがとう、R.

于 2013-03-16T14:15:17.137 に答える