0

如果我像这样在另一个 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 子类,结构非常简单。

我的问题是:为什么?

4

2 回答 2

2

ARC 负责内存管理,但在这些行中

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

没有什么建议它应该保留 cvc。你只保留它的观点。cvc 被释放,你得到 exc_bad_access

于 2013-07-24T11:11:02.517 回答
2

正如其他人所提到的,BrowseCVC被 ARC 释放。您可以通过为其创建 iVar 或属性,或将其作为 childViewController 添加到您的 viewController 来解决此问题:

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

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

于 2013-07-24T11:16:32.460 回答