2010-09-30 40 views
0

這裏我在'test'方法中使用了'tempString'的自動釋放。根據規則,我應該在主體中使用「[temp retention]」。但我沒有使用它。它仍然可以正常工作並打印輸出。那麼「保留」的需求是什麼?任何人都可以告訴我原因嗎?提前致謝。爲什麼它沒有'保留'的對象工作正常?

-(NSMutableString *) test : (NSMutableString *) aString{ 

NSMutableString *tempString=[NSMutableString stringWithString:aString]; 

[tempString appendString:@" World"]; 

    return tempString;} 

int main(){ 

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

MemoryMgmt *memoryMgmt=[[MemoryMgmt alloc] init ]; 
NSMutableString *str1 [email protected]"Hello"; 

NSMutableString *temp = [memoryMgmt test: str1]; 

NSLog(@" %@",temp); 

[pool drain]; 
return 0; 
} 

回答

4

stringwithString應該返回一個自動釋放NSMutableString,但那並不實際上直到NSAutoReleasePool下水道。您正在使用該對象,同時池仍然保留着它,並且只在之後排出池,釋放該對象。

當您從某處收到自動釋放的對象時,如果您打算跟蹤當前變量作用域之外的對象,則只應保留該對象。如果你要保留這個對象,但是你的引用超出了範圍(就像在你當前的函數調用完成之後那樣),你就會泄漏該對象。

您在這裏做的事實際上是正確的,因爲您不保留對temp的引用,而只是在本地範圍內。

0

當自動釋放一個對象時,它會在運行循環結束時解除池排出或釋放......在你的情況,因爲你開始一個新的線程,管理自動釋放池,字符串溫度不會釋放,直到你耗盡你的游泳池,因此,當你使用它,它仍然是有效的...希望可以幫助

0

這是有效的,因爲Autorelease池在工具執行結束前不會清空。然而,它實際上是正確的用法:你從一個不聲稱將所有權傳遞給調用者的方法中返回一個自動釋放對象。有人做

return [[tempString retain] autorelease]; 
相關問題