我有一个名为 AllThingsViewController 的视图控制器,它动态创建名为 ThingViewController 的其他视图控制器,并将它们的顶级视图添加到 UIScrollView。(我正在编写专有代码,因此我更改了类的名称,但我的代码结构完全相同。)
下面是它的 loadView 方法包含的内容:
NSArray *things = [[ThingDataController shared] getThings];
if ([things count] == 0) {
// code in this block is not relevant as it's not being executed...
} else {
for(unsigned int i = 0; i < [things count]; ++i) {
ThingViewController *thingViewController = [[ThingViewController alloc] init];
[thingViewController loadView];
[scrollView addSubview:thingViewController.topView];
thingViewController.topView.frame = CGRectNewOrigin(thingViewController.topView.frame,
0, thingViewController.topView.frame.size.height*i);
[thingViewController displayThing:thing[i]];
}
}
ThingViewController 的 loadView 方法如下所示:
- (void)loadView
{
NSArray *topLevelObjs = nil;
topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"ThingView" owner:self options:nil];
if (topLevelObjs == nil)
{
NSLog(@"Error: Could not load ThingView xib\n");
return;
}
}
当我的应用程序启动时,一切都会正确显示,直到我尝试点击 ThingViewController 加载的 xib 中存在的按钮之一,此时它由于异常而崩溃:“无法识别的选择器已发送到实例”。似乎 ARC 过早地发布了我的 ThingViewController 实例。
查看我的代码,我认为这是因为它们没有保留任何东西,所以我在 AllThingsViewController 类中创建了一个 NSMutableArray 作为实例变量,并开始将 ThingViewControllers 添加到其中:
NSArray *things = [[ThingDataController shared] getThings];
if ([things count] == 0) {
// not being executed...
} else {
for(unsigned int i = 0; i < [things count]; ++i) {
ThingViewController *thingViewController = [[ThingViewController alloc] init];
[thingViewController loadView];
[scrollView addSubview:thingViewController.topView];
thingViewController.topView.frame = CGRectNewOrigin(thingViewController.topView.frame,
0, thingViewController.topView.frame.size.height*i);
[thingViewController displayThing:thing[i]];
[allThingsViewControllers addObject:thingViewController];
}
}
然而,它并没有改变任何东西,即使这些对象被添加到数组中。最后,为了确认这是 ARC 提前释放它,我将“thingViewController”更改为 AllThingsViewController 中的实例变量并更改:
ThingViewController *thingViewController = [[ThingViewController alloc] init];
成为:
thingViewController = [[ThingViewController alloc] init];
果然,当我点击它的按钮时,可滚动列表中的最后一项不会崩溃,但其他的会崩溃,因为它的 ThingViewController 没有被释放。
我对 ARC 还是比较陌生,但是经过一堆谷歌搜索后,我不知道如何解决这个问题。我该怎么办?