我遇到了一個奇怪的問題,試圖理解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];
}
您的代碼看起來正確。您應該自動釋放副本。你使用的是什麼版本的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
你是對的,我使用了一般情況並簡單地將它命名爲Point。在我的代碼中,它出現在我的Matrix3x3,Matrix4x4,Vector3,Vector4類中。爲了這個問題,我試圖列舉一個一般情況。 - 我編輯了這個問題以使用Point2D來避免更多的混淆。 另外,我正在使用Xcode 4.2 Build:4C199 – TReed0803
它必須是Xcode中的一個錯誤。試試Xcode 4.3 – user102008