【问题标题】:Calling release method crashes iOS app调用 release 方法使 iOS 应用程序崩溃
【发布时间】:2011-09-07 10:59:43
【问题描述】:

我将 UIView 子类化为工具栏,并将各种按钮和其他视图添加到该类中。现在,在我的 ViewController 标题中,我有这个:

@interface GridViewController : UIViewController <UIWebViewDelegate, UIScrollViewDelegate> {
    Toolbar *toolbar;
}

@property (retain) Toolbar *toolbar;

在实现中我有这个:

@synthesize toolbar;

- (void)viewDidLoad {
    [super viewDidLoad];
    CGRect toolbarRect = CGRectMake(0, 0, 1024, 40);
    self.toolbar = [[Toolbar alloc] initWithFrame:toolbarRect];
    [self.view addSubview:toolbar];
}

- (void) dealloc {
    [toolbar release];
    [super dealloc];
}

现在,如果我运行分析,它基本上表示我有潜在的内存泄漏。如果我添加[工具栏发布];就像我通常在添加子视图时一样调用 addSubView:toolbar 之后,当我弹出 ViewController 时应用程序崩溃。

我做错了什么?我已经尝试阅读有关内存管理的所有内容,并且根据这一点,您总是必须释放/自动释放您分配/复制/保留的东西等。如果我查看我的代码,我会在标题中保留实例变量,并且在实现中分配它,所以保留计数应该是+2,因此我需要释放它两次,但似乎我误解了一些东西。非常感谢任何帮助。

当我说崩溃时,我得到了这个:Xcode 暂停并在 main.m 中说 EXC_BAD_ACCESS 用于此行

int retVal = UIApplicationMain(argc, argv, nil, nil);

在控制台中我得到了这个:

modifying layer that is being finalized - 0x60895f0 

【问题讨论】:

  • 对我来说,参考计数应该是 +3。一个用于分配,另一个用于在 self.property 中保留,另一个在 addSubview 中保留。你说当你在 addSubview 之后添加 release 语句时它在弹出期间崩溃,你能发布这个错误的堆栈跟踪吗?
  • 向问题添加了崩溃信息。
  • 如何在 Instruments with Zombies 下运行您的应用程序?这将帮助您识别您正在访问的对象,该对象已被释放。

标签: ios memory-management


【解决方案1】:

如果属性self.toolbar 设置为(retain),则表明在self.toolbar = [[Toolbar alloc] initWithFrame: toolbarRect]; 行之后,保留计数应为+2。我建议用self.toolbar = [[[Toolbar alloc] initWithFrame: toolbarRect] autorelease] 替换该行以使保留计数保持在1。这应该可以解决它,因为来自addSubview 的保留不是由您管理的,您在@987654327 中释放toolbar @。

所有带有保留设置器的属性都应该被赋予一个自动释放的对象。

【讨论】:

  • 不,这与之前的结果相同——应用程序在 popViewController 上崩溃
【解决方案2】:

似乎问题实际上出在 Toolbar 类而不是 ViewController 中。我没有为 ivars 使用 setter,因此它开始崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多