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]; 
}