2010-05-17 78 views
1

我的應用程序中的一些UIViewControllers需要在其viewDidLoad方法中向「提供者」類註冊。我剛剛將它們添加到提供程序類中包含的NSMutableArray中。不保留的NSMutableArray?

但是,我不希望這個NSMutableArray阻止它們被釋放,並且我也想讓它們從它們的dealloc方法中的NSMutableArray中移除它們自己。

我試着在發佈[self release]之後將它們添加到數組中,並且這可以工作,但爲了避免在它們被釋放時發生崩潰,我必須在刪除它們之前發出[self retain]。看起來好像我通過在自己的dealloc方法中保留一個對象來做一些可怕的錯誤。

有沒有更好的方法來存儲這些值?

回答

3

你不能以你想要的方式去做,因爲你會有循環依賴。你不能釋放一個NSArray中的對象。

您需要讓它們在數組生命週期中的某個時刻從數組中明確地移除它們,或者將它們留在那裏,並在數組取消分配時讓它們釋放。

2

我認爲你應該重新考慮這一點。也許有VC註冊與提供者在viewWillAppear和取消註冊viewDidDisappear?

編輯 - This answer提到一種方式來獲得的NSDictionary不保留,也許你可以使用它的NSArray也(如果你還想去這條路線)。查看CFArray,在CFArrayCreate操作中,callBacks參數。

+0

viewDidDisappear被當按下一個NavigationViewController頂部的另一個視圖調用。這不起作用。 – synic 2010-05-17 16:58:28

3

計數記憶的主要參考規則之一是,你應該只處理所有你自己開始的保留。在這種情況下,通過釋放來平衡數組中的保留,打破了該規則。

一個更好的選擇將不是釋放它,而是讓它從陣列中移出,執行相反的操作。將它添加到數組後,請確保釋放您擁有的任何保留,以便擁有它的唯一對象是數組本身。然後,當你想擺脫對象,而不是釋放它,從數組中刪除它。

您還應該看看如何設置notification API。它有一個類似的設置項目「註冊」與中心,然後需要被刪除,所以你可以嘗試和重做你的提供者類的東西。

2

我的預感告訴我,「提供者」類應該添加東西到自己的數組中。聽起來有些奇怪的是UIViewControllers將自己添加到它們的所有者中。

,而不是像這樣:

-(void)viewDidLoad { 
    ... 
    [self.provider registerViewController:self]; 
    ... 
} 

爲此在提供程序類:

view = [[MyViewController alloc] init...]; 
[self registerViewController:view]; 

如果提供者需要知道當視圖控制器關閉,使之成爲代表:

viewController = [[MyViewController alloc] init...]; 
[self registerViewController:viewController]; 
viewController.delegate = self; 

回調在UIViewController裏面看起來像這樣:

[self.delegate myViewControllerHasFinished:self]; 

和提供者會做到這一點:

-(void)myViewControllerHasFinished:(MyViewController *)vc { 
    [self unregisterViewController:vc]; 
}