我在子类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.
答案 0 :(得分:0)
您在没有(retain)属性的情况下声明您的属性。这意味着,当您为此属性分配路径时,运行时只执行指针赋值并且不会 - 获取路径,因此当您使用CGPathRelease()路径引用时,它将被取消分配。因此,您必须在占位符图像类上声明属性,如下所示:
@property (retain) id pathHold;
然后像这样分配:
[holderImageView setPathHold:(id)myPath];
请注意,在声明中我使用'id'作为类型。这是因为几乎所有的CoreGraphics和CoreFoundation类型实际上都是一个有效的Objective-C对象,因此可以完成这种转换(免费桥接),只需要进行类型转换以避免编译器警告。