iOS 应用程序在释放保留的属性时崩溃

标签 ios objective-c properties uikit autorelease

我有一个问题。这个问题可能有一个非常简单的解决方案,但我还无法弄清楚。如果我使用一个属性,请说@property(nonatomic,retain)UIView *mainView

现在我将它合成在.m文件中并在dealloc方法中释放它,如下所示:

- (void)dealloc {
   [mainView release], mainView = nil;
   [super dealloc];
}

然后在我的 viewDidLoad 中,我分配它并将其添加为我的 self.view 的 subview ,如下所示:

- (void) viewDidLoad {

  mainView = [[UIView alloc] init];
  .
  .
  .
  [self.view addSubView: mainView];
}

现在我明白,此时我的 mainView 将有 3 个引用计数(一个来自 alloc,一个因为它是保留属性,第三个是我将其添加到 self. view),它的父 Controller 也将拥有它。 现在,我的问题是,如果将我的 View 添加到 self.view 后,我使用

释放我的 mainView
[mainView release];

当我返回到上一个 View 时,我的应用程序崩溃了,因为我正在向已释放的对象发送释放。现在我的问题是我如何在这里过度表达我的观点。我错过了什么,因为当我使用以下代码时,它工作正常并且没有发生崩溃。

- (void) viewDidLoad {
  UIView *newView = [[UIView alloc] init];
  self.mainView = newView;
  [newView release];
  .
  .
  .
  [self.view addSubView: mainView];
}

我知道为什么第二个 viewDidLoad 方法有效,但我不知道为什么第一个方法失败,我应该在将其添加到 self.view 后释放我的 View 。对吗?

注意:我知道在第一个 viewDidLoad 中,我可以使用 autorelease 方法来释放分配给 ivar 的 View ,并且它不会崩溃,但重点是我正在尝试减少 autorelease 的使用越多越好。而且我根本没有使用 ARC

我非常感谢您的解释和建议。

最佳答案

根据你的问题:

Now i understand that at this point my mainView would have 3 reference counts (one from alloc, one coz its a retained property and the third one when i added it to self.view)

你没有通过属性赋值而是直接赋值给实例变量,所以没有retain;仅在 ARC 中,分配给实例变量才会保留值。因此,请勿执行手动释放。

关于iOS 应用程序在释放保留的属性时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14351089/

相关文章:

c# - 接口(interface)可以包含变量吗?

properties - 如何使属性文件可供 WebSphere Application Server 8 中的 EJB 使用

java - 可以将一个属性值分配给其他属性文件中的另一个属性吗

ios - UICollectionViewCell 布局问题 iOS9

iphone - 从表中删除行时出错

objective-c - iOS 7.0 下的无效上下文 0x0 和系统降级

ios - 从日期字符串开始的 24 小时时间

ios - CollectionView 单元格内的 MapView 不显示折线 Swift 4

ios - 难以将 Array 的内容写入 tableview

ios - UIscrollview 中的自定义 UIButton