2012-01-12 101 views
0

我有一個方法接收一個數組,然後將其存儲在NSObject屬性中。複製對象值

- (void)updatePoints:(NSArray *)pointArrayPassed 
{ 
    pointArray = pointArrayPassed; 
    pointCount= pointArray.count; 
} 

下面的代碼工作,但顯然保持pointArrayPassed的指針,所以當我可以,它反映了調用堆棧。但是,如果我使用pointArrayPassed的副本,則應用程序開始大量泄漏!

是否有一種方法在函數中傳遞值而不是指針?

+0

如何複製它? 'pointArray = [pointArrayPassed copy]'? – kennytm 2012-01-12 13:24:45

+0

是的,抱歉忘了補充 – 2012-01-12 13:32:45

+2

我不明白你在說什麼。你沒有說明你的變量是如何聲明的,它們的生命週期是什麼等等,或者你的意思是「所以當我可以,它反映了調用堆棧」。 – 2012-01-12 13:33:04

回答

2

您不能僅僅將副本粘貼在iVar中而不會釋放當前對象。否則,您將失去可以發送release消息的指針 - 這就是爲什麼它會泄漏到整個地方。

這是一個更好的替代品。

- (void)updatePoints:(NSArray *)pointArrayPassed 
{ 
    if (pointArray == pointArrayPassed) { 
     //the new array is the same as the current one. Do nothing 
     return; 
    } 
    [pointArray release]; 
    pointArray = [pointArrayPassed copy]; 
    pointCount = pointArray.count; 

} 

它沒有這樣做的最優雅的方式。

更好的方法是將pointArray聲明爲copy作爲其內存管理語義(這是顯而易見的,因爲您有一個可變/不可變類集羣)。並有一個名爲-pointCount的單獨方法,它在需要時返回計數。