使用CGPathRelease释放路径导致BAD_ACCESS

时间:2011-12-03 17:20:19

标签: iphone objective-c ios xcode cocoa-touch

我在子类UIImageview中有一个CGMutablePathRef属性。当我创建一个新路径并将其分配给属性时,CGPathRelease在调用CGPathContainsPoint时会导致错误。如果我不释放路径,代码工作正常,但有泄漏。如何正确转移所有权和发布?

.h // UIImageView subclass
@property CGMutablePathRef pathHold;


.m
CGMutablePathRef myPath;
myPath = CGPathCreateMutable();
CGRect myRect2 = holderImageView.bounds;
float midX = CGRectGetMidX(myRect2);
float midY = CGRectGetMidY(myRect2);

CGAffineTransform t = 
CGAffineTransformConcat(
                        CGAffineTransformConcat(
                                                CGAffineTransformMakeTranslation(-midX, -midY), 
                                                     CGAffineTransformMakeScale(holderImageView.pathZone,holderImageView.pathZone)), 
                        CGAffineTransformMakeTranslation(midX, midY));
CGPathAddEllipseInRect(myPath, &t, myRect2);
CGPathCloseSubpath(myPath);

[holderImageView setPathHold:myPath];
CGPathRelease(myPath); // If path not released, works fine but leak.  
[self addSubview:holderImageView];
[holderImageView release];


.m
if(CGPathContainsPoint (self.pathHold, NULL, touchLocation, FALSE )) // This Causes error.

1 个答案:

答案 0 :(得分:0)

您在没有(retain)属性的情况下声明您的属性。这意味着,当您为此属性分配路径时,运行时只执行指针赋值并且不会 - 获取路径,因此当您使用CGPathRelease()路径引用时,它将被取消分配。因此,您必须在占位符图像类上声明属性,如下所示:

@property (retain) id pathHold;

然后像这样分配:

[holderImageView setPathHold:(id)myPath];

请注意,在声明中我使用'id'作为类型。这是因为几乎所有的CoreGraphics和CoreFoundation类型实际上都是一个有效的Objective-C对象,因此可以完成这种转换(免费桥接),只需要进行类型转换以避免编译器警告。