Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 添加子视图时发生泄漏_Objective C_Iphone_Memory Management - Fatal编程技术网

Objective c 添加子视图时发生泄漏

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

因此,Instruments告诉我有三个内存泄漏源于此方法(具体来说,它指出了这一行: [self.view addSubview:menuBar.view]

我看不到漏洞,正在绞尽脑汁。我保留着对menuBar对象的引用,并正在释放它。有谁比我更聪明的人可以解释吗?我的XIB中有三个menuBar项目,而我却有三个漏洞,这是巧合吗

以下是整个方法:

// 根vc调用以切换屏幕上菜单栏的显示状态

-(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方法获得的对象,这是错误的。