【发布时间】: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