我的一个UIViewController
有几个子视图控制器。它们是在界面构建器中构建的,方法是将NSObject
拖到左侧的“对象”部分,然后将我自己的SpecialViewController
作为“自定义类”。通过此设置,在viewDidLoad
后,我将拥有自己的视图和控制器。工作流程由以下屏幕截图建议:
在我的实施中,我有:
@interface ParentController : UIViewController
{
SpecialViewController *svc;
}
@property (nonatomic, retain) IBOutlet SpecialViewController *svc;
据我了解,在didReceiveMemoryWarning
期间,我应该释放自己的资源。然后在IBOutlets
期间将viewDidUnload
设置为nil。
我在模拟器中模拟低内存时遇到崩溃,调试器暂停didReceiveMemoryWarning
SpecialViewController
(其正文仅为[super didReceiveMemoryWarning];
),错误为EXC_BAD_ACCESS (code=1, address=0xe0000008)
。此时,父控制器不可见,因此可以安全地释放它。
父控制器在[super didReceiveMemoryWarning];
中仅包含didReceiveMemoryWarning
。我已经尝试在两个类中弄乱IBOutlets
。它没有帮助。
知道为什么会这样吗?
我的目标是iOS 4& 5用ARC。 SpecialViewController
是UITableViewController
的子类。
通过跟踪,我发现在ParentController didReceiveMemoryWarning
之前调用SpecialViewController
。
答案 0 :(得分:2)
在这里,您可以在视图控制器中看到一个视图控制器。您选择创建这样的课程有什么特别的原因吗?根据我的经验,每个UIViewController应该是一个单独的子类。基于didReceiveMemoryWarning
中出现错误的事实,我认为问题出在其他地方。你能分享这个View Controller的初始化代码吗?
如果你正在尝试像UIViewController Containment这样的东西,你应该查看涵盖这个过程的WWDC主题。
答案 1 :(得分:2)
查看控制器的didReceiveMemoryWarning
默认实现将释放他们的视图;您的责任仅是发布在viewDidLoad
或loadView
中创建的任何其他观看次数,以及对IBOutlet子视图的任何强有力的引用。
您有另一个视图控制器的强引用,当视图再次可见时,将不会重新创建。您应不使用didReceiveMemoryWarning
来释放sec
实例变量;相反,依靠SpecialViewController
的{{1}}实现来处理释放它的观点。
在实践中,我使用didReceiveMemoryWarning
发布我的主视图(didReceiveMemoryWarning
)并使用self.view
发布在viewDidUnload
中创建的任何内容。我发现方法名称的平衡及其用途直观。如果您在viewDidLoad
中创建内容,请在viewDidLoad
中发布。