2011-05-29 50 views
0

如果我用一個返回一個NSMutableArray的方法創建一個NSObject類,是否需要釋放類中的數組還是該類永遠不會保留?關於NSObject類的簡單問題/保留計數

如何解釋那麼這裏不知道是一些代碼:

@implementation PointsClass 

- (NSMutableArray *)pointsForLevel 
{ 
NSMutableArray *_points = [NSMutableArray new]; 

    [_points addObject:[NSValue valueWithCGPoint:CGPointMake(521, 279)]]; 
    [_points addObject:[NSValue valueWithCGPoint:CGPointMake(321, 491)]]; 
    [_points addObject:[NSValue valueWithCGPoint:CGPointMake(419, 477)]]; 

return _points; 
} 

@end 

如果我叫從視圖控制器這種方法是這樣的:

PointsClass *pointsClass = [PointsClass new]; 
NSMutableArray *points = [pointsClass pointsForLevel]; 
[pointsClass release]; 

難道我只需要釋放的指針數組? _points數組是否已被保留?

回答

2

新會給你一個保留數爲1的對象。所以,是的,你需要在某個地方平衡一下這個版本。

這裏的約定是返回[_points autorelease],然後讓調用者決定他是否需要保留數組一段時間。

+0

感謝Firoze,這是我的問題。如果我使用_points = [[NSMutableArray new] autorelease];我的應用程序崩潰。 – EcksMedia 2011-05-29 04:56:45

+0

@EcksMedia Firoze是正確的。調用[pointsClass pointsForLevel]傳遞自動釋放的NSMutableArray。所以現在,只要需要,來電者必須保留它。可能您可以添加更多代碼來查看點變量實際使用的位置? – marcus 2011-05-29 06:44:37

0

Apple's Memory Management Programming Guide(你應該讀絕對)總結說最好:

  • 你只釋放或自動釋放你自己 對象。
  • 你拿,如果 您使用其 名稱以「黃金」的方法創建一個對象的所有權,「新」, 「複製」,或「mutableCopy」(對於 例如,分配,NEWOBJECT,或 mutableCopy),或者如果您發送一個 保留消息。
  • 您使用release或autorelease來放棄對象的所有權。 自動釋放只是意味着 「在未來發送 釋放消息」(具體:當使用 自動釋放池接收漏極 消息理解時,這將是 ,請參見「自動釋放池」)。

因爲您使用「新」創建它,所以您有責任將其釋放。我會建議,而不是以下之一:

  • autorelease_points返回之前。然後調用者可以決定是否保留它,或者...
  • 重命名您的方法以反映由它返回的對象必須是釋放的事實(如newPointsForLevel)。

另外,您正在創建PointsClass的一個實例(通過new),並且不將它分配給一個變量。這是內存泄漏。

幾個其它指針:

  • 分配/初始化通常優於新,儘管它們在功能上是相同的。有關該主題的更多信息,請參閱here
  • 我不推薦使用前導下劃線命名局部變量 - 通常保留用於實例變量。
+0

感謝您的迴應,我完全理解,如果我創建了一個對象,您需要釋放它,但是在此示例中我遇到的問題是要釋放的問題? Autorelease崩潰我的應用程序。我正在考慮通過dealloc釋放我認爲可能是正確的事情。另外,感謝提供關於未將PointsClass分配給var的提示,我已經在我的代碼中糾正了這一點,並將在上面的示例中進行說明。 – EcksMedia 2011-05-29 05:17:19