2011-05-03 81 views
3

爲什麼不挽留需要在我的代碼,但它的工作原理

@implementation MyClass 

- (void) foo  
{  
    ivar = [NSString stringWithString:@"ivar"]; 
} 

- (void) bar  
{  
    NSLog(@"%@", ivar); 
} 

而且main.m文件

MyClass * m = [[MyClass alloc] init]; 
[m foo]; 
[m bar]; 

爲什麼不挽留是需要stringWithString一類?

你能告訴我一個需要保留的例子嗎?

回答

4

這是因爲自動釋放池沒有時間耗盡其內容。這裏是一個崩潰的例子:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
MyClass *m = [[MyClass alloc] init]; 
[m foo]; 
[pool drain]; 
[m bar]; 

保存在您的示例字符串屬於99%到創建的開始事件循環的一個新池當前runloop,然後在年底水渠它的自動釋放池。

+0

所以你的意思是我應該作爲最佳實踐下面寫: 伊娃= [[NSString的stringWithString:@「伊娃」]保留]; – Howard 2011-05-03 14:13:56

+0

你知道[NSString stringWithString:@「ivar」] == @「ivar」,對吧? @「伊娃」永遠不會被釋放,它是您的可執行文件的一部分。 – hooleyhoop 2011-05-03 14:53:52

2

爲什麼不需要保留stringWithString?

因爲自動釋放池沒有在第2行和第3行之間流失(因爲只要代碼將控制權返回給運行循環,它就會在Cocoa應用程序中)。

+0

所以我應該寫出好的做法?伊娃= [[NSString的stringWithString:@「伊娃」]保留] – Howard 2011-05-03 16:54:43

0

看看來自蘋果的Memory Management Rules。在你的情況下,你沒有分配/保留/淨NSString,所以你不「擁有」它,因此你不需要釋放它。

在內部,NSString會返回一個自動釋放對象。如果你不保留它,那麼如果它被自動釋放池處理,你將失去它的引用。

+1

的問題不是「爲什麼不讓我需要釋放伊娃?」,而是「爲什麼它似乎,即使我沒有聘請伊娃工作? 「這裏的一些其他的答案是正確的:它的工作原理,因爲伊娃指向一個自動釋放的字符串,自動釋放池尚未被抽乾。 – Caleb 2011-05-03 14:07:26

+0

@Caleb:公平點,我誤解了問題。 – Damien 2011-05-03 14:16:49

相關問題