我的应用中的一些UIViewControllers需要在viewDidLoad
方法中注册“provider”类。我刚刚将它们添加到提供程序类中包含的NSMutableArray中。
但是,我不希望这个NSMutableArray阻止它们被dealloc'ed,我也希望让它们在dealloc方法中从NSMutableArray中删除它们。
我尝试在将[self release]
添加到数组后发出[self retain]
,这样可行,但是为了避免在被解除分类时发生崩溃,我必须先发出{{1}}我删除它们。看来我通过在自己的dealloc方法中保留一个对象来做一些可怕的错误。
有更好的方法来存储这些值吗?
答案 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];
}