2012-06-24 68 views
2

我遇到了一個奇怪的問題,試圖理解Apple的內存管理標準。比方說,我有一個方法返回一個副本,而不讓用戶知道它是一個副本。Objective-C返回Autoreleased副本

+(Point2D*) Add:(Point2D*)a To:(Point2D*)b 
{ 
     Point2D * newPoint = [a copy]; 
     [newPoint Add:b]; // Actually perform the arithmetic. 
     return [newPoint autorelease]; 
} 

問題是Xcode的Analyze函數將此標記爲發送太多的對象 - 自動調用。我假設這是因爲-copy隱含地假設你正在獲得所有權,因此可能有+0保留計數的可能性。但我不完全確定。

Xcode的分析信息

+(Point2D*) Add:(Point2D*)a To:(Point2D*)b 
{ 
     Point2D * newPoint = [a copy]; // <- 1. Method returns an Objective-C object with a +0 retain count. 
     [newPoint Add:b]; 
     return [newPoint autorelease]; // <- 2. Object sent -autorelease method. 
             // <- 3. Object returned to caller with a +0 retain count. 
             // <- 4. Object over -autoreleased: object was sent -autorelease but the object has zero (locally visible) retain counts. 
} 

上爲什麼會發生任何提示或提示嗎?除非我遺漏了一些東西,否則代碼應該正常工作,因爲autorelease不會觸發,直到安全時間(即它的工作類似於便利構造函數,用戶有時間保留)。

根據請求,-copyWithZone:將被實現爲這樣:

-(id)copyWithZone:(NSZone *)zone 
{ 
     return [[Point2D allocWithZone:zone] initX:x Y:y Z:z]; 
} 
+0

您的代碼看起來正確。您應該自動釋放副本。你使用的是什麼版本的Xcode?在我的,我甚至不能命名一個名爲「Point」的類型,因爲它與QuickTime中的類型衝突:https://developer.apple.com/library/mac/#documentation/QuickTime/Reference/QTRef_DataTypes/Reference/ reference.html#// apple_ref/doc/uid/TP40003454-GlobalQuickTimeAPITypes-Point – user102008

+0

你是對的,我使用了一般情況並簡單地將它命名爲Point。在我的代碼中,它出現在我的Matrix3x3,Matrix4x4,Vector3,Vector4類中。爲了這個問題,我試圖列舉一個一般情況。 - 我編輯了這個問題以使用Point2D來避免更多的混淆。 另外,我正在使用Xcode 4.2 Build:4C199 – TReed0803

+1

它必須是Xcode中的一個錯誤。試試Xcode 4.3 – user102008

回答

0

Point類正確實施-copyWithZone:(NSZone*)zone(或至少請它拷貝到這裏)

+0

我已經編輯了原始文章以包含-copyWithZone :,感謝您的快速響應! - 注意:這不能解決分析問題,因爲我已經使用-copyWithZone:已經實現。 :( – TReed0803

+1

啊,看看:「copyWithZone:方法的子類版本應該首先發送消息給超級,以合併它的實現,除非子類直接從NSObject下降。」(c)來自Apple的NSObject類引用。嘗試實現copyWithZone correct。 –

+0

https://developer.apple.com/library/mac/#samplecode/Sketch+Accessibility/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008920下載此示例代碼並嘗試查看copyWithZone實現(NSObject的SKTGraphic和SKTGraphic的SKTImage) –

相關問題