2012-01-30 30 views
0

我有這樣的功能分配和初始化對象:分配和初始化一個函數對象,將其發送到其他功能,並釋放它有

+(Item*)getItem:(NSString*)uid{ 
     Item *file = [[Item alloc]init]; 
     //do some stuff 
     return file; 
    } 

,這是調用這個函數:

Item *tmp = [LibraryScan getItem:itemid]; 
    //do some stuff 
    [tmp release]; 

現在我想釋放它後,我得到它,就像我上面寫。 我做對了嗎?

+0

任何特殊的原因,而不是使用autorelease池來代替它? – 2012-01-30 09:31:43

+0

有什麼理由爲什麼要這樣做呢? – MTA 2012-01-30 09:35:27

+0

只有當你非常需要爲使用大量內存的特殊算法手動處理內存。否則,autorelease肯定是要走的路。 – 2012-01-30 09:39:57

回答

4

在我看來,你應該還,讓他想上它的所有權呼叫者決定之前自動釋放對象:

+(Item*)getItem:(NSString*)uid{ 
    Item *file = [[Item alloc]init]; 
    //do some stuff 
    return [file autorelease]; 
} 

所以:

Item *tmp = [LibraryScan getItem:itemid]; 
//do some stuff 
//[tmp release]; nothing to release 
1

是你的代碼是正確的。但是它也應該符合這樣的Objective-C命名約定:聲明返回非自動釋放對象的方法(即 - 調用者負責釋放的對象)應該在方法名中包含copy,alloc或new。

所以我會改變你的方法名稱爲newItem,如果你真的想從它返回非自動釋放對象。

+0

你有沒有任何例子如何以你的方式做到這一點? – MTA 2012-01-30 09:36:34

+0

他表示方法的名稱應該是,根據命名約定: +(項目*)getNewItem:(的NSString *)UID +(項目*)allocItem:(的NSString *)UID 或者類似的東西。 – 2012-01-30 09:40:19

+0

@MTA,它將完全像你的代碼,但+ getItem方法名稱更改爲+ newItem。 – Vladimir 2012-01-30 09:41:39

0

它沒有錯,但它不是一個標準的方式。

此修改的實現:

+(Item*)getItem:(NSString*)uid { 
    Item *file = [[[Item alloc]init]autorelease]; 
    //do some stuff 
    return file; 
} 

和:

Item *tmp = [[LibraryScan getItem:itemid]retain]; 
//do some stuff 
[tmp release]; 

它會幫助你正確地調試內存泄漏。

相關問題