2010-09-13 29 views
1

當我們寫作[Obj autorelease]時會發生什麼?當我們在Autorelease池中編寫[Obj autorelease]時會發生什麼?

例如:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];<br> 
NSMutableString *str = [[[NSMutableString alloc]initWithString:@""] autorelease];<br> 
NSLog(str);<br> 
[str appendString:@" I"];<br> 
NSLog(str);<br> 
[str appendString:@" like"];<br> 
NSLog(str);<br> 
[str appendString:@" programming"];<br> 
NSLog(str);<br> 
[pool drain];<br> 
NSLog(@"%@",str); //invalid 

我很困惑,因爲我讀的是「你可以通過發送一個自動釋放消息的對象添加到當前的自動釋放池後發佈」,所以當我寫

NSMutableString *str = [[[NSMutableString alloc]initWithString:@"my"] autorelease]; 

1)執行完上面的語句後, 現在str已經添加到autorelease池了嗎?

2)如果str加入到自動釋放 池,那麼如果我們 後指海峽這(釋放/排水 池),就像...之前

[str appendString:@" I"]; 
NSLog(str); 
[str appendString:@" like"]; 
NSLog(str); 
[str appendString:@" programming"]; 
NSLog(str); 

然後STR的引用將可從autorelease池(因爲str現在被添加到autorelease池)或str的初始內存位置....?

令人困惑...... !!任何人都可以給我清楚的想法!

+0

請勿使用br標籤。使用「101010」按鈕來格式化代碼 – 2010-09-13 15:51:03

回答

2

1)是的,只要你發送一個對象-autorelease消息,它就會被添加到自動釋放池中。

2)執行的以下代碼行後...

NSMutableString *str = [[[NSMutableString alloc]initWithString:@"my"] autorelease]; 

(其中,順便說一下,可以改寫這樣):

NSMutableString *str = [NSMutableString string]; 

...有兩個對新字符串的引用;一個在autorelease池中,第二個在你的本地變量str中。換句話說,每個都包含你的字符串對象的地址。所以這個對象並不是真的在'池'中,而是'變'出來。

當您向池發送-release消息時,它會向其當前引用的對象發送-release消息。請注意,一個對象可以在給定週期內發送多個-autorelease消息,在這種情況下,該池將向該對象發送相應數量的-release消息。

如果你發現這個東西很混亂,獲得更多見解的好方法是閱讀Apple的Memory Management Guide

+1

值得一提的是:'str'不包含對象,也不包含池。 'alloc','init'和'autorelease'消息的初始鏈返回指向該對象的指針,它就是你放入該變量的指針。當你將'autorelease'消息發送給對象時,'autorelease'方法也將相同的指針放入池中。指針在兩個地方;該對象總是隻在一個地方,兩個指針指向的地方。 – 2010-09-13 19:16:14

相關問題