调用release方法会使iOS应用程序崩溃



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

@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];
}

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

我做错了什么?我试着阅读所有关于内存管理的信息,根据这些信息,你总是要释放/自动释放你分配/复制/保留的东西等。如果我看一下我的代码,我在头文件中保留了实例变量,并在实现中分配了它,所以保留计数应该是+2,因此我需要释放它两次,但似乎我误解了一些东西。如有任何帮助,不胜感激。

当我说崩溃,我得到这个:Xcode暂停,说EXC_BAD_ACCESS这一行在main.m

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

,在控制台我得到这个:

modifying layer that is being finalized - 0x60895f0 

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

所有带有retain setter的属性都应该被赋予一个autorelease对象

似乎问题实际上是在工具栏类,而不是ViewController。我没有为变量使用setter,因此它开始中断。

相关内容

最新更新