2011-02-02 17 views
1

例如看看下面的例子:在實例方法中分配對象的建議方法是什麼,它將在以後返回?

代碼1

-(NSString*)getString{ 
    return [[[NSString alloc] initWithFormat:@"test"] autorelease]; 
} 

-(void)printTestString{ 
    NSString *testStr = self.getString; 
    [testStr retain] 
    NSLog(@"%@",testStr); 
    [testStr release] 
} 

代碼2

-(NSString*)getString{ 
    return [[NSString alloc] initWithFormat:@"test"]; 
} 

-(void)printTestString{ 
    NSString *testStr = self.getString; 
    NSLog(@"%@",testStr); 
[testStr release]; 
} 

代碼1和代碼2應該是有效的代碼段和無泄漏應該會出現。

代碼1使用autorelease,所以返回變量必須保留在printTestString中,並在使用它釋放後。所以在這裏有一個小的開銷,因爲autorelease。

代碼2不會釋放getString中的NSString,因此您必須在使用它之後才能釋放它。似乎你必須少寫,而且沒有開銷,因爲沒有使用autorelease。

哪一個是在那裏使用的事實上的「標準」方法?

我還問自己的另一件事。可在的getString自動釋放和與

[testStr retain] 

保留成爲一個問題,當自動釋放池

NSString *testStr = self.getString; 

那麼這個字符串是消失後釋放變量權。這是可能的還是編譯器阻止這種事情?

感謝

-Sebo

+1

@MusiGenesis下面是我推薦的方法:如果你不喜歡Obj-C,不要編程,也不要回答人們的Obj-C問題。 – jakev 2011-02-02 23:51:00

+0

@JakeVA謝謝! – Sebo 2011-02-02 23:54:10

回答

2

這樣做:

-(NSString*)getString{ 
    return [[[NSString alloc] initWithFormat:@"test"] autorelease]; 
} 

-(void)printTestString{ 
    NSString *testStr = self.getString; 
    NSLog(@"%@",testStr); 
} 

你getString方法自動釋放NSString的,這意味着printTestString不需要保留或釋放。 getString中的自動釋放是有道理的,因爲它允許對象,因此是對象的「所有者」。我建議在繼續之前學習Objective-C的內存管理規則,因爲它們非常重要。

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH

2

傑克的答案是,幾乎所有的你需要從方法返回一個對象的情況下是正確的,但也有情況下,您可能要返回的東西,是不是自動釋放。從Memory Management Programming Guide(Mac版,但它們是相同的規則):

你需要一個對象的所有權,如果你使用 名字 開始「黃金」或「新」或 的方法創建它包含「複製」(例如,alloc, newObject或mutableCopy),或者如果您向其發送保留消息,則爲 。

此外,從Coding Guidelines for Cocoa

在你的方法和功能 返回的對象值,確保 返回這些值自動釋放 除非它們是用於創建對象或 對象的副本方法(新增,分配,複製 及其變體)。 「」中的「自動釋放」這個上下文並不一定意味着 該對象必須明確地 自動釋放 - 即將 自動釋放發送到 之前的對象,並返回它。在一般意義上說,它只是意味着返回值不是由調用者釋放的 。

出於性能方面的考慮,這是 建議避免在方法實現自動釋放 對象 只要你能,特別是可能在短期內頻繁執行 代碼 ; 這樣的代碼的例子將是具有未知的 和可能的高循環計數的循環。

因此,含有前綴方法allocnew,或那些按照慣例包含單詞copy將有你回來沒有被自動釋放的對象。實際上,Clang靜態分析器瞭解這種約定,並假定從遵循這些命名規則的方法返回的非自動釋放對象。

我在使用new前綴的情況下,首選不返回自動釋放對象(我不想管理自動釋放池等的緊密循環)。同樣,返回自動釋放對象是幾乎所有情況下推薦的,但有時您可能想避免這種情況。

相關問題