【问题标题】:iOS: Custom viewcontrollers as ivarsiOS:自定义视图控制器作为 ivars
【发布时间】:2013-07-24 11:06:28
【问题描述】:

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

我的问题是:为什么?

【问题讨论】:

  • 如果我可以写 15 个字符以下的 cmets,我只会评论 - ARC

标签: ios objective-c uiviewcontroller uicollectionview


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 2015-01-14
      • 1970-01-01
      相关资源
      最近更新 更多