[英]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.