簡體   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