2012-01-17 18 views
3
我的當前項目的

閱讀源代碼,我看到:有沒有[自我保留]有效的情況?

[self retain] 

在一類,在其init方法。

我不明白原因。 從Apple閱讀內存管理規則,我沒有看到任何關於此的內容,並且我沒有看到任何假設的[self release]

回答

3

對象在初始化時聲明自己的所有權。我可以看到這可能是有用的唯一原因是如果對象需要保證自己的存在,直到發生某些事件。例如,它可能運行一個計時器,然後在計時器到期時自行釋放。

如果沒有記錄並且沒有相應的版本,那可能是一個錯誤。

-3

如果你有一些對象,就像它有healts/lives。當你創造它時,它有一個生命。和。功能'保留'增加他的生命數量+1,釋放功能減少他的生命數量-1,dealloc也減少,分配增加

+1

這絕對不是OP要求的。問題是''自我保留]是如何工作的,而不是正常的'保留'。 – Skyler 2012-01-17 11:49:45

1

如果我正確地記得有些類使用自我保留來避免過早釋放。我會說這不是最佳實踐,但如果你知道遊戲規則(在這種情況下是Obj-C),你可以打破它們(有時)。

+0

不完全。當你調用'show',然後你不再需要它時,你可以有效地將警報移交給UIKit,因此你可以釋放它。毫無疑問,在UIKit的幕後,有一些東西在保持着它(例如它將被添加到視圖層次結構中,因此它的超級視圖將保留它的一開始)。 – mattjgalloway 2012-01-17 11:51:11

+0

正確...應用程序窗口可能是保持器。 – 2012-01-17 11:52:11

1

這似乎可能是一個錯誤,通常不是由對象保留自己。

我只看到一個特殊情況:委託和通知,在這裏你必須更加小心你的生命週期,但即使這種情況下,釋放/保留不應該在對象本身中完成。

注到埃裏克:

在UIAlert的情況下,可以釋放它之前已經被破壞,因爲視圖已經但是在視圖hiercarchy,然後引用。因此,視圖將從視圖層次結構中刪除時自動銷燬。

+0

是的......我已經提到過了。 – 2012-01-17 11:56:04

+0

何時銷燬?也許在回覆委託之後,在用戶按下按鈕之後,不是嗎? – Ricardo 2012-01-17 12:28:56

1

保留self並沒有錯。但看到它在init方法聽起來很可疑。我想不出一個好的例子,說明這將是一件好事。另外,儘管使用ARC,你甚至無法做到這一點,所以你不得不考慮更好的做事方式。一般來說,如果一個對象需要活着,那麼會有另一個對象持有它。自我保留的對象很容易出錯,永遠不會被釋放。

2

最好的猜測是編寫代碼的人有一個保留錯誤,這是圍繞真正問題的「快速解決方案」。

相關問題