我将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,因此它开始中断。