繁体   English   中英

使用CGPathRelease释放路径导致BAD_ACCESS

[英]Releasing path with CGPathRelease causing BAD_ACCESS

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

.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.

您要声明的属性没有(保留)属性。 这意味着,当您将路径分配给该属性时,运行时仅执行指针分配,而不保留路径,因此,当您对路径引用CGPathRelease()进行分配时,它将被释放。 因此,您必须像这样在占位符图像类上声明属性:

@property (retain) id pathHold;

然后像这样分配它:

[holderImageView setPathHold:(id)myPath];

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM