Objective c 添加子视图时发生泄漏
因此,Instruments告诉我有三个内存泄漏源于此方法(具体来说,它指出了这一行: [self.view addSubview:menuBar.view] 我看不到漏洞,正在绞尽脑汁。我保留着对menuBar对象的引用,并正在释放它。有谁比我更聪明的人可以解释吗?我的XIB中有三个menuBar项目,而我却有三个漏洞,这是巧合吗 以下是整个方法: // 根vc调用以切换屏幕上菜单栏的显示状态Objective c 添加子视图时发生泄漏,objective-c,iphone,memory-management,Objective C,Iphone,Memory Management,因此,Instruments告诉我有三个内存泄漏源于此方法(具体来说,它指出了这一行: [self.view addSubview:menuBar.view] 我看不到漏洞,正在绞尽脑汁。我保留着对menuBar对象的引用,并正在释放它。有谁比我更聪明的人可以解释吗?我的XIB中有三个menuBar项目,而我却有三个漏洞,这是巧合吗 以下是整个方法: // 根vc调用以切换屏幕上菜单栏的显示状态 -(IBAction) showToolBar { //if no toolbar exists
-(IBAction) showToolBar {
//if no toolbar exists, create one and add it to the view
if (!menuBarView) {
MenuBarViewController *menuBar = [[MenuBarViewController alloc] initWithNibName:@"MenuBarViewController" bundle:nil];
menuBar.book = self.selectedTitleDeck;
menuBar.booksArray = self.allTitleDeck;
self.menuBarView = menuBar;
[self.view addSubview:menuBar.view];
[menuBar release];
}
CGRect frame = menuBarView.view.frame;
[UIView beginAnimations:nil context:NULL];
if (self.toolBarIsDisplayed == NO) {
//show the toolbar
frame.origin.y = 725;
self.toolBarIsDisplayed = YES;
} else if (self.toolBarIsDisplayed == YES) {
//hide the toolbar
frame.origin.y = 788;
self.toolBarIsDisplayed = NO;
}
self.menuBarView.view.frame = frame;
[UIView commitAnimations];
}
addSubview:保留传递给它的视图(请参阅)。调用addSubview后,可以释放该视图,如:
MenuBarViewController *menuBar = [[MenuBarViewController alloc] initWithNibName:@"MenuBarViewController" bundle:nil];
menuBar.book = self.selectedTitleDeck;
menuBar.booksArray = self.allTitleDeck;
self.menuBarView = menuBar;
[self.view addSubview:menuBar.view];
[menuBar.view release];
[menuBar release];
}
向我们展示MenuBarViewController的dealloc方法中发生的情况。我怀疑您忘记释放其实例变量。正如对我的问题的评论中所建议的,问题不在代码中,而是在模拟器中运行我的应用程序并尝试检测内存泄漏 当仪器按照设备上的代码运行时,不会报告泄漏 我的安慰奖是在两天的努力中发现了对内存管理的更深刻的理解,试图找到一个不存在的漏洞
感谢大家的建议,非常感谢。只是检查一下你在设备上看到的,而不是在模拟器上看到的,对吗?同意尼克的问题——这是在设备上还是在模拟器上?在检查泄漏时,模拟器是不允许的。另外,我上次在addSubview中看到泄漏:是在我的一个多线程应用程序中,我在那里进行了UI cal在主线程之外。你的应用程序不是多线程的,是吗?我已经尝试了好几天了。是的,我是在模拟器中做的。切换到设备,找不到漏洞。感觉很愚蠢,但是,我想,生活和学习。谢谢伙计们!-1你不能这么做。你从一开始就违反了内存管理规则id未通过new、alloc或copy获得menuBar.view,并且您尚未保留它。它仍然由addSubview保留。它可能是一个自动删除的对象,因此它将一直保留,直到addSubview保留为止。这意味着您永远无法保留通过init或new方法获得的对象,这是错误的。