2011-01-21 75 views
1

我有一個視圖控制器作爲導航控制器堆棧的一部分與兩個IBOutlets。在viewDidUnload我釋放他們:我是否需要在dealloc中釋放IBOutlets?

- (void)viewDidUnload 
{ 
    self.myView1 = nil; 
    self.myView2 = nil; 
    [super viewDidUnload]; 
} 

但我仍然有泄漏。所以我堅持發佈消息dealloc他們也:

- (void)dealloc 
{ 
    [myView1 release]; 
    [myView2 release]; 

    [super dealloc]; 
} 

這似乎清除內存泄漏。但是,我總是被告知我應該只使用發佈我使用alloc,copy或new創建的ivars。所以我很擔心這兩個版本在這裏。這是對還是錯?有人可以向我解釋這一點,因爲我不斷收到矛盾的意見......謝謝!

回答

8

如果您的任何@property對象被聲明爲retaincopy,則需要在dealloc中釋放它們。這包括你的網點。

+2

謝謝。我聽說過「分配,複製或保留」的規則,但並沒有真正考慮到XIB在加載時保留它的事實。我會嘗試並將其刻入我的腦海! – jowie 2011-01-23 18:35:30

1

通過使用IBOutlet,變量暴露在Interface Builder中連接並在視圖控制器初始化時分配。所以當視圖控制器被卸載和釋放時,它們必須被釋放和釋放。由於大多數IBOutlet都保留有UI *屬性,因此這是必需的。

將nils分配給變量在技術上不會解除分配。這只是在實際被釋放之前保留計數爲0的最後一個狀態。

此外,請注意,他們是使用自我引用。這意味着,來自視圖控制器的引用變爲零,而不是分配。

所以在最後,IBOutlet中屬性必須在的dealloc()釋放

(雖然我相當有信心,別人可以爲此提供100%的正確答案。)

+0

如果您使用點格式化訪問器將您的屬性設置爲零,並且您的屬性屬於(保留)類型,那麼您將釋放先前存在的任何對象。屬性設置器看起來像這樣(僞代碼)[myProperty release]; myProperty = newObject; [newObject retain]; – averydev 2011-04-10 01:10:56

1

基本,安全模式

  • 聲明伊娃
  • 申報伊娃在dealloc中
  • 釋放性IBOutlet中財產
  • 只是參考性質,從來沒有伊娃

的廈門國際銀行設置屬性,它釋放任何可能已經有第一位。

我有點困惑,爲什麼那裏有泄漏。將該屬性設置爲零應該釋放舊的引用。也許viewDidUnload甚至沒有被調用?你確定你甚至需要viewDidUnload嗎?

+0

是的,viewDidUnload永遠不會被調用。我一直在四處看看Stack,很多人也這樣說...我猜操作系統緩存它以防萬一需要它嗎?我認爲viewDidUnload在有內存警告時會被調用,但它不是給定的。 – jowie 2011-01-23 18:30:56

相關問題