2011-12-03 38 views
1

我在子類UIImageview中有一個CGMutablePathRef屬性。當我創建一個新路徑並將其分配給屬性時,CGPathRelease在我調用CGPathContainsPoint時會導致錯誤。如果我沒有發佈代碼工作正常的路徑,但有泄漏。我如何正確轉讓所有權和發佈權?使用CGPathRelease釋放路徑導致BAD_ACCESS

.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

你聲明的屬性沒有(retain)屬性。這意味着,當您爲此屬性分配路徑時,運行時只會執行指針分配,並且不會保留您的路徑,因此當您爲CGPathRelease()路徑引用時,它將被取消分配。所以,你必須聲明的佔位符圖像類的屬性是這樣的:

@property (retain) id pathHold; 

,然後分配給它這樣的:

[holderImageView setPathHold:(id)myPath]; 

請注意,我用的「身份證」類型的聲明。這是因爲幾乎任何CoreGraphics和CoreFoundation類型實際上都是一個有效的Objective-C對象,因此可以完成此轉換(免費橋接),只需要進行類型轉換即可避免編譯器警告。

+0

這是一個夢幻般的答案,並幫助我在很多方面。我不確定如何妥善保留這一點。謝謝你:) – user973984

+0

NP ;-)值得一提的是,CF *和CG *結構都是'id'類型,它會幫助你很多。 – 2011-12-03 18:33:15

+0

作爲一個小點,並不是說Core基礎類型是有效的Objective-C對象,而是基礎CFType橋接到NSObject,正如Mike Ash在這裏解釋的:http://www.mikeash.com/pyblog/friday- qa-2010-01-22-toll-free-bridging-internals.html和Ken Ferry在他的答案中提到:http://stackoverflow.com/a/1539634/19679。 –

相關問題