0

我爲popover創建了一個(UIPopoverController)彈出窗口控制器和(UINavigationController)導航控制器,其中兩個控制器都在頭文件中聲明。然後,當它們被創建時:安全釋放UINavigationController?

myNavController = [[UINavigationController alloc] initWithRootViewController:[[[MyPopoverControllerClass alloc] initWithNibName:@"MyPopoverNib" bundle:[NSBundle mainBundle]]autorelease]]; 

myPopoverController = [[UIPopoverController alloc] initWithContentViewController:myNavController]; 

此時,是否可以安全地釋放myNavController?

回答

2

如果這個班級不打算再次引用它,你可以在初始化你的彈出控制器後釋放你的導航控制器。

+0

在MyPopoverControllerClass中,我創建後在myNavController上調用pushViewController,並且用戶單擊popover上顯示的項目...所以我不應該在這裏釋放myNavController嗎? – John 2011-01-21 16:42:57

1

如果myNavController是一個實例變量,那麼您應該不會釋放它,直到您的方法爲dealloc。如果它只是一個局部變量,那麼應該在該方法的最後一個引用之後釋放它。

+0

正;如果您有保留的參考,則「擁有」該對象。如果該參考不再需要,您應該釋放它。如果它是一個實例變量,並且你在'dealloc`之外釋放``,那麼給實例變量賦`nil`也是一個好主意,所以你最終不會得到一個懸掛指針。 – bbum 2011-01-22 16:08:17

0

只要想一想Object Ownership and Disposal公約,其中簡要說如果你已經分配了一個對象,你就是它的主人。

換句話說,只要不需要它,您都有權釋放myNavController

從另一方面來說,UIPopoverController應該使用retain來取得myNavController的所有權。

所以,(再次)是的。您可以放心地發佈myNavController

有一些罕見的情況下,不尊重所有權公約規則。這些例外情況在具體方法的文檔中提及。但事實並非如此。

讓我們運用這些規則爲您的片斷: 在第一行

myNavController = [[UINavigationController alloc] initWithRootViewController:[[[MyPopoverControllerClass alloc] initWithNibName:@"MyPopoverNib" bundle:[NSBundle mainBundle]]autorelease]]; 

保留myNavController計數至少 1.

第二行

myPopoverController = [[UIPopoverController alloc] initWithContentViewController:myNavController]; 

會導致myNavController的保留計數爲至少 2,通過initWithContentViewController內的所有權。

+0

*不*調用`retainCount`。鑑於`UIPopoverController`是UIKit框架中的一個類,在任何給定時間的保留計數完全是一個實現細節。試圖將含義賦予絕對值是徒勞的。認爲完全保留爲所有權和三角洲;如果你不再需要擁有一個對象,你可以釋放它。 – bbum 2011-01-22 16:07:03