2011-04-13 32 views
1

當一個方法返回一個從NSMutableArray中取出的對象時,該對象是否必須被自動釋放?檢查以下方法。我也應該autorelease無零值?從NSMutableArray返回的自動釋放對象

-(NSObject*)getElementByID:(NSString*)ID{ 

    for(int i=0;i<[elements count];i++){ 
     NSObject *element = (NSObject*) [elements objectAtIndex:i]; 

     if([element.key isEqualToString:ID]){ 
      return [element autorelease]; 
     } 
    } 

    return nil; 
} 

回答

3

您不能自動發佈element因爲您不是它的所有者(您沒有保留它)。如果您使用alloc,newretain購買它,您將成爲它的所有者。既然你獲得了這個叫objectAtIndex:的對象,你並不擁有它。請參閱Three Magic Words。在這裏調用autorelease會導致後來的崩潰做到過度釋放。

您的方法名稱不正確,並打破KVC。以get開頭的方法必須帶有一個將隨結果更新的指針。這應該是elementForID:。如上所述的三個魔術字,在ObjC中命名對編寫穩定代碼非常重要

作爲一個附註,傳統上使用id是大多數情況而不是NSObject*。他們的意思稍有不同,但通常是id是正確的。

+0

謝謝。這有很大幫助。 – Cyprian 2011-04-13 16:22:51

0

你不需要做任何與內存管理有關的事情nil。所以,不,你不應該發送autoreleasenil

您也不應該將autorelease發送給您從elements陣列返回的element對象。由於elements本身保留了它,您返回的那個對象將保留在內存中。如果調用方法想要retain您返回的值,則可能。但是,如果該調用方法僅在其自己的作用域內使用返回的值,則不保留它是安全的。

相關問題