2012-08-02 32 views
0

我對Objective-C中的內存管理有疑問。目標C中使用[release] C

-(void)viewDidLoad 
{ 
NSNumber *num=[[NSNumber alloc] initWithInt:10]; 
[num release]; 
NSLog(@」%i」,num); 
} 

上述代碼通過打印值正常工作。但是一旦物體被釋放,它就會失去它的價值?那麼它的工作狀況如何呢?

+4

它打印什麼? '%i'意思是「整數值」,你已經給出了一個對象指針;'%@'是適當的'NSLog()'值來試圖打印對象(否則你只是看着整數指針的值,據推測...)。 – 2012-08-02 03:55:39

回答

-1
  1. 通過在對象上調用[release]我們可以減少對象的保留數。
  2. 如果通過調用具有copy,new,alloc的方法創建對象,則調用者被稱爲該對象的所有者,並且所有者應該總是釋放擁有的對象。
  3. 如果您不擁有該物件,則不應釋放它。
  4. 當對象被保留時總是調用釋放對象,這意味着如果一個調用保留方法,則相應的釋放調用應該調用 。應該匹配保留的釋放。
1

以下是發生了什麼事。首先,你這樣做:

NSNumber *num=[[NSNumber alloc] initWithInt:10]; 

num變量現在包含一個指向NSNumber對象,(因爲你使用alloc)你自己該對象。然後,你這樣做:

[num release]; 

當你發送release的對象,你放棄了你的所有權。該對象可能仍然存在並保持不變,或者可能已被銷燬。你不知道。您的num變量仍然包含相同的指針,但它指向的內存現在可能不是有效的對象,因此您無法安全地將消息發送到該對象。

然後你這樣做:

NSLog(@」%i」,num); 

在這種NSLog說法,你是治療num整數爲指針,因爲%i格式的整數。你只是在打印對象所在的地址(內存位置)(可能還是 - 你不知道)。所以num是否指向一個有效的對象並不重要;你只是將num視爲任意整數。您並未嘗試向NSNumber對象發送任何消息。

+0

謝謝你搶劫....這是一個明確的解釋。 – Preethi 2012-08-02 08:43:50