iOS:自定义viewcontrollers作为ivars

时间:2013-07-24 11:06:28

标签: ios objective-c uiviewcontroller uicollectionview

如果我在另一个UIViewController 中使用UICollectionView子类,就像这样......

BrowseCVC *cvc = [self.storyboard instantiateViewControllerWithIdentifier:@"BrowseItemVC"];
[self.containerScrollView addSubview:cvc.view];

...要么滚动集合视图,要么点击一个单元格,它会因EXC_BAD_ACCESS而崩溃。

但是,如果我将其声明为@property (strong, nonatomic) BrowseCVC *cvc;)并像这样使用它......

self.cvc = [self.storyboard instantiateViewControllerWithIdentifier:@"BrowseItemVC"];
[self.containerScrollView addSubview:self.cvc.view];

......一切正常。

BorwseCVC是一个不起眼的UICollectionViewController子类,结构非常简单。

我的问题是:为什么?

2 个答案:

答案 0 :(得分:2)

ARC负责内存管理,但在这些方面

BrowseCVC *cvc = [self.storyboard instantiateViewControllerWithIdentifier:@"BrowseItemVC"];
[self.containerScrollView addSubview:cvc.view];

没有什么可以暗示它应该保留cvc。您只保留其视图。 cvc被取消分配,你得到exc_bad_access

答案 1 :(得分:2)

正如其他人所说,BrowseCVC被ARC取消分配。你可以通过为它创建一个iVar或属性,或者将它作为childViewController添加到你的viewController来解决这个问题:

BrowseCVC *cvc = [self.storyboard instantiateViewControllerWithIdentifier:@"BrowseItemVC"];
[self addChildViewController:cvc];
[self.containerScrollView addSubview:cvc.view];

这应该是最干净的解决方案。