2013-05-09 50 views
5

如果我寫 -NSObject發佈了,NSString,NSArray不是?

NSObject *a = [[NSObject alloc] init]; // or UIView or something 
[a release]; 
NSLog(@"a = %@", a); // causes EXC_BAD_ACCESS, fine 

但是,如果我寫 -

NSArray *a = [[NSArray alloc] init]; // or NSString or NSDictionary 
[a release]; 
NSLog(@"a = %@", a); // no crash, prints empty array or string 

爲什麼第二種情況下不會引起不良的訪問,因爲它釋放?

回答

8

訪問發佈的對象不必立即使應用程序崩潰。

請注意,即使您釋放對象,內存也會保留一段時間,但內容相同。只有當對象內存已被其他對象覆蓋時,纔會發生崩潰。並且請注意,即使覆蓋了內存,您也不必崩潰。你只能得到一些非常奇怪的行爲(例如,當對象是NSString時,它可以得到不同的內容)。

基本上,這種行爲是完全隨機的。使用釋放的對象可能會使應用程序立即崩潰,或者在5分鐘或2小時內崩潰。

編輯: 由於馬丁 - [R一個有趣的評論。看起來由[[NSArray alloc] init]創建的數組,即空的不可變數組,總是返回相同的實例。這意味着您的release不會使其被解除分配。但是,這種行爲很容易發生變化,在編譯器或操作系統版本之間會有所不同。

+0

你比我快,我會以完全相同的方式回答,但我甚至沒有輸入一個單詞。 +1 – borrrden 2013-05-09 09:57:05

+0

但釋放NSObject或UIView等肯定崩潰立即,而NSArray或NSString等絕對不會立即崩潰。所以在內存使用中必須有一些差異,釋放數組或字符串的情況。那是什麼? – user1559227 2013-05-09 10:11:34

+0

請參閱** random **。在這種情況下,它會崩潰的NSObject,但不是NSArray。如果你用不同的選項進行編譯,它可能不會這樣。操作系統如何使用內存取決於許多因素。這是*釋放*和*釋放之間的區別* – borrrden 2013-05-09 10:16:03