一个不保留的NSMutableArray?

时间:2010-05-17 15:32:32

标签: iphone objective-c

我的应用中的一些UIViewControllers需要在viewDidLoad方法中注册“provider”类。我刚刚将它们添加到提供程序类中包含的NSMutableArray中。

但是,我不希望这个NSMutableArray阻止它们被dealloc'ed,我也希望让它们在dealloc方法中从NSMutableArray中删除它们。

我尝试在将[self release]添加到数组后发出[self retain],这样可行,但是为了避免在被解除分类时发生崩溃,我必须先发出{{1}}我删除它们。看来我通过在自己的dealloc方法中保留一个对象来做一些可怕的错误。

有更好的方法来存储这些值吗?

4 个答案:

答案 0 :(得分:3)

你不能按照你想要的方式去做,因为你会有循环依赖。您无法释放NSArray中的对象。

你需要让它们在生命周期的某个时刻从数组中显式删除它们,或者只是将它们留在那里,让它们在数组被释放时释放。

答案 1 :(得分:3)

引用计数记忆的主要规则之一是,您应该只处理任何属于您的保留。在这种情况下,释放以平衡阵列的保留会破坏该规则。

一个更好的选择是不是释放它而是将它从阵列中移除,执行相反的操作。将它添加到数组后,请确保释放您拥有的任何保留,以便拥有它的唯一对象是数组本身。然后,当你想要摆脱对象而不是释放它时,将其从数组中删除。

您还应该了解notification API的设置方式。它有一个类似的项目设置'注册'与中心,然后需要删除,所以你可以尝试重做你的提供程序类这样的东西。

答案 2 :(得分:2)

我认为你应该重新考虑这一点。也许在viewWillAppear中将VC注册到提供者并在viewDidDisappear中取消注册?

编辑 - This answer提到了一种不保留NSDictionary的方法,也许你也可以将它用于NSArray(如果你仍然想要去那条路线)。在CFArrayCreate操作中查看CFArray,callBacks参数。

答案 3 :(得分: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];
}