[英]Calling release method crashes iOS app
我将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
如果将self.toolbar
属性设置为(retain)
则建议在self.toolbar = [[Toolbar alloc] initWithFrame: toolbarRect];
保留数应为+2。 我建议用self.toolbar = [[[Toolbar alloc] initWithFrame: toolbarRect] autorelease]
替换该行,以使保留计数保持为1。这可能应该解决,因为addSubview
的保留不受您和您释放了dealloc
toolbar
。
具有保留设置器的所有属性都应被赋予一个自动释放的对象。
看来问题出在实际上是在Toolbar类中,而不是在ViewController中。 我没有使用setter来作为ivars,因此它开始崩溃了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.