2011-01-19 118 views
3

至於這個帖子: iPhone - dealloc - Release vs. niliOS內存管理跟進。 dealloc vs nil?

1) [foo release]; 
2) self.bar = nil; 

的解釋如下:

  1. 正在釋放的對象,通過實例變量酒吧訪問它。實例變量將成爲懸掛指針。這是dealloc中的首選方法。

  2. 是一個分配零到自我的屬性欄,將在實踐中發佈的任何財產,目前保留。如果你有一個屬性的自定義setter,那麼應該這樣做,它應該清除不僅僅是支持屬性的實例變量。

有人請澄清#1的解釋嗎?通過實例變量訪問

例如,我在我的對象頭設置一個私人VAR像這樣:

SomeObject *oPointer; 

我不使用這個指針在頭文件屬性setter和它得到合成時,實例化目的。

在我的代碼中,在給定的條件下,我稍後必須分配這個指針給它的對象。

obj = [[SomeObject alloc] initWith....]; 

所以這通過實例變量OBJ現在訪問。我有一個UIButton被配置爲重置這個對象,它附加的方法釋放它。我通過這樣做:

[obj release]; 
obj = nil; 

畢竟是解釋的問題是,爲什麼我還宣佈與obj =零? [obj發佈]調用似乎也殺死了指針。我在想,[OBJ發行]會取消分配它指向的內存,並且還設置OBJ爲零所有在一杆,但現在看來,這也殺死指針,因爲我的應用程序崩潰時,它試圖引用OBJ[obj release];

這個問題有意義嗎?是簡單的解釋[obj發佈]確實全部清理,包括殺死指針,我需要知道這一點?

如果我爲SomeObject指針設置retain屬性,指針在發佈後仍然保留?

提前致謝!

回答

3

調用釋放將減少對obj的引用計數。如果引用計數變爲0,那麼它將被解除分配。指針obj仍然指向相同的內存位置,但訪問它可能會導致程序崩潰。將obj設置爲零並不是絕對必要的,但強化了obj不再有效的想法。在調試時,或者在程序後面,如果你想有選擇地重新創建obj並使用「if(obj!= nil)」檢查來確定它是否已經被創建,它會很有用。

如果你設置它保留作爲一個屬性,那麼當它被稱爲是「self.obj = someObj中」,Objective C中會添加一個someObj中的引用計數。你不應該叫保留自己上通過的alloc-init建立的東西,因爲ALLOC-INIT已經設置引用計數爲1。如果你保留的對象,那麼當它被釋放時,引用計數只能回去1,這將成爲內存泄漏。

3

[obj release]; 減少對象obj指向的保留計數並可能導致它被釋放。這不會改變obj指針,它繼續指向內存中的某個位置。

obj = nil;obj指針設置爲零。這是建議但不是必需的。如果你不這樣做,而是繼續使用obj指針,那麼你很可能會意外地試圖訪問用於保存您在上面發佈的對象的內存位置。如果該對象已被釋放,則會導致崩潰或至少意外的行爲。通過設置obj爲零可以確保任何未來的obj使用將消息發送到零與該正常良好定義的行爲。

0

釋放的對象仍然指向同一個對象。我一直都做,荷蘭國際集團的viewDidLoad中,以及在applicationDidFinishLaunching

4

無原因有兩個最好:

  • nil是安全的,呼籲的方法,而已經公佈的引用不是。

如果是retain屬性,self.thinger = nil;也會調用release。如果沒有,它不會。

  • 無論您使用retainassign屬性是要保持乾燥,這意味着你不希望有切換什麼,但assign/retain標籤和完成代碼。在您的dealloc中使用release必須與屬性保持同步。

如果使用autorelease嚴格,你幾乎不必自行調用release除了在定製setter方法retain性能。

Check out the seminal article on NARC.自動釋放是你的朋友。