我的一个UIViewController有几个子视图控制器。它们是在接口构建器中构建的,方法是将一个NSObject拖到左侧的"Objects“部分,然后将其放入我自己的SpecialViewController中作为"Custom Class”。有了这个设置,在viewDidLoad上,我将准备好我的视图和控制器。工作流程由以下屏幕截图提供建议:

在我的实现中,我有:
@interface ParentController : UIViewController
{
SpecialViewController *svc;
}
@property (nonatomic, retain) IBOutlet SpecialViewController *svc;据我所知,在didReceiveMemoryWarning期间,我应该释放我自己的资源。然后在viewDidUnload期间将IBOutlets设置为nil。
我在模拟器中模拟内存不足时崩溃,调试器在SpecialViewController的didReceiveMemoryWarning (它的主体就是[super didReceiveMemoryWarning];)处暂停,并显示错误EXC_BAD_ACCESS (code=1, address=0xe0000008)。此时,父控制器不可见,因此可以安全地释放它。
父控制器在didReceiveMemoryWarning中也只包含[super didReceiveMemoryWarning];。我在这两个类中都尝试过niling IBOutlets。这没什么用。
知道为什么会这样吗?
我的目标是iOS 4&5和ARC。SpecialViewController是UITableViewController的一个子类。
通过跟踪,我发现在SpecialViewController之前调用了ParentController didReceiveMemoryWarning。
发布于 2012-05-07 21:47:38
看起来你在视图控制器里有一个视图控制器。你选择这样创建这个类有什么特别的原因吗?根据我的经验,每个UIViewController都应该是一个单独的子类。基于您的错误出现在didReceiveMemoryWarning中的事实,我认为问题出在其他地方。你能分享一下这个View Controller的初始化代码吗?
如果您正在尝试像UIViewController容器这样的东西,那么您可能应该查看涵盖此过程的WWDC主题。
发布于 2012-05-07 22:10:31
视图控制器的didReceiveMemoryWarning默认实现将释放它们的视图;您的职责只是释放在viewDidLoad或loadView中创建的任何其他视图,以及对IBOutlet子视图的任何强引用。
您有一个对另一个视图控制器的强引用,当视图再次变为可见时,将不会重新创建该控制器。您不应该使用didReceiveMemoryWarning来释放sec实例变量;相反,应该依靠SpecialViewController的didReceiveMemoryWarning实现来负责释放它的视图。
在实践中,我使用didReceiveMemoryWarning发布我的主视图(self.view),并使用viewDidUnload发布在viewDidLoad中创建的任何内容。我发现这些方法的名称和使用之间的平衡是很直观的。如果您在viewDidLoad中创建了某个内容,请在viewDidUnload中发布它。
https://stackoverflow.com/questions/10429235
复制相似问题