2011-08-04 86 views
1

Scenario1之間的區別:什麼是兩個代碼的情況

NSDictionary *dictionary = 
       [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 
self.stateZips = dictionary; 
[dictionary release]; 

Scenario2:上stateZips財產

self.stateZips = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 

回答

4

dependes。
如果是retained
方案1:stateZips適當保留(上stateZips釋放將調用它的dealloc)。當地的字典也隨即發佈。
場景2:stateZips被保留兩次(stateZips中的發佈將不會調用它的dealloc,因爲它仍然保留)。

如果是assigned
方案1:stateZips點公佈的字典和訪問它其他地方可能會導致崩潰。
場景2:stateZips已妥善保留(stateZips的發佈將調用其dealloc)。

copy不被考慮,因爲我相信它不是你的本意(至少在這段代碼)

+0

對不起Tatvamasi,當我發佈我的時候,我沒有看到你的問題。他們非常相似;我會投票給你,但我也會離開我的,因爲它看起來有些不同。 – sidyll

1

都可以導致self.stateZips設置爲與文件初始化的字典指出,在plistPath

但是,第二,沒有保存指向已初始化字典的指針,並且由於它是保留計數爲+1的對象,在技術上需要將release消息發送到某個位置,以平衡內存管理。但是由於沒有辦法檢索指向該對象的指針,最終會導致內存泄漏。

兩個例外:

1.Garbage收集
如果在垃圾回收的環境的時候,兩者是相同的。那麼,它們是不一樣的,但結果是相似的。

2.Property型
如果stateZips的setter只是分配指針,那麼你可以使用伊娃指針釋放對象。然後這兩段代碼只有一個區別:在前者中,該對象在使用後立即釋放。在後者中,它只是「未定義」。沒有上下文,就很難確定這個對象是否被釋放,以及什麼時候被釋放。

+0

這真的是對的嗎?編譯器當然可以優化這個,所以只有一個保留被調用?在Objective-C中關於內存管理的所有內容中,我從來沒有見過scenario2的例子是泄漏。 – iandotkelly

+0

情景2 *如果財產保留,則爲*泄漏。 – progrmr

0

我假設stateZips是一個帶有retain屬性的屬性。

在方案1.在第一行中創建一個保留計數爲1的字典。在第二行中,屬性將再次調用retain,將保留計數增加到2.最後,保留計數由釋放減少。這將使字典保留正確的計數。

在情況2中,保留僅被調用一次。

這兩種情況的淨效應是相同的。字典對象將被保留,並且您將需要在該類的dealloc方法中包含一個發行版。

如果編譯器沒有正確處理這個問題,那麼遵循objective-c的保留/釋放規則確實會非常困難。