2011-03-04 40 views
1

我的应用程序提供了在设备上,而不是在simulator.I仪器采用低内存崩溃,我认为,问题出在下面的部分内存泄漏导致应用程序崩溃

 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 

     [button setBackgroundImage:[UIImage imageNamed:@"gembtnblu.png"] forState:UIControlStateNormal];<br> 

     button.frame = CGRectMake(0, 0, TOOLBAR_BUTTON_WIDTH , TOOLBAR_BUTTON_HEIGHT);<br> 

     [button setTitle:[NSString stringWithFormat:@"%c",choice] forState:UIControlStateNormal];<br> 

     [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 

     [button addTarget:self action:@selector(ChoiceButtonTouched:) forControlEvents:UIControlEventTouchUpInside]; 

     [button setTag:choice]; 

     UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 

     //Add button to the array 
     [tempItems addObject:customBarItem]; 

     if (isReviewing == TRUE) { 
      customBarItem.customView.userInteractionEnabled=FALSE; 
     } 
     //release buttons 
     [customBarItem release]; 

     numberOfChoices++; 

,但林不能当场problem.Please帮助guuys,我已经beeen停留在此,现在天

继承人一些代码

NSArray *items=[[NSArray alloc] initWithArray:(NSArray *)tempItems];
[tempItems release];

//add array of buttons to toolbar 
[toolbar setItems:items animated:YES]; 
[self.view addSubview:toolbar]; 

静态分析器说,这是一个潜在的'items'数组泄漏。但是如果我放入一个发布声明,应用程序崩溃

回答

0

您是否在将工具栏添加为子视图后才发布工具栏?如果你没有,并且没有释放dealloc中的工具栏,那么你的泄漏。

+0

是的,我的ID释放工具栏 – humblePilgrim 2011-03-09 14:11:35

0

您创建的映像很大吗?这可能是因为你正在将一条巨大的消息加载到内存中,而不是释放它。

我建议在此代码上运行静态分析器(构建和分析),这些错误应该可以帮助您了解不应该释放的东西。

+0

图像是一个小png.I使用静态分析器,它告诉我,即时泄漏数组。但是当我释放它时,应用程序在模拟器中崩溃。我的stuk因为即时调试通过teamviewer和无法调试实际device.ill发布更多代码 – humblePilgrim 2011-03-04 14:41:58

+0

如果在您释放数组时发生崩溃,那么在您的程序完成使用之前,您可能会释放它。尝试将该版本稍后放入代码中,或者将该数组附加到自动释放池。 – Nicholas1024 2011-03-04 14:48:00

+0

自动发布会在几次发布后让它崩溃,而发布会立即崩溃:-( – humblePilgrim 2011-03-04 14:52:34

0

您发布的源代码片段不包含内存管理错误。我在这里假设你加载的图片很小,因为这是一个按钮。请注意,imageNamed:缓存图像,但假设图像很小,这不是问题。

问题出在代码的其他地方,或者您的设备上有太多的应用程序同时打开。注意应用程序在后台运行:这些仍然在进食内存。尝试关闭所有应用程序,并再次在设备上运行您的应用程序。查看执行相同代码片段时是否遇到完全相同的行为。

+0

是的,另一方的人关闭了所有其他应用程序并尝试过。这实际上是一个测验应用程序,按钮用于输入选项,每次单击下一个按钮时,按钮都会重新加载。此时,仪器会记录一次泄漏......它每次都会发生。 – humblePilgrim 2011-03-04 14:51:30

+0

等一下。泄漏可能不一定与您的代码相关联:它可能是一块分配的内存在你正在链接的一个框架中,一些将在稍后发布的东西。你是否检查了泄漏是否实际上是指你的源代码?仪器清楚地标记了每个泄漏块属于你的代码(它甚至会告诉你泄漏源于何处)或库/框架代码 – 2011-03-04 23:29:29

0

在分配新按钮和列表之前,您可能不会释放旧按钮和列表。也许你应该重新使用旧的按钮,而不是创建新的类似按钮。

+0

嗯。但不知道该怎么做,因为即时释放所有创建的按钮后,将它们添加到工具栏 – humblePilgrim 2011-03-04 15:08:23

+0

您是否正在释放旧的工具栏及其中的按钮? – hotpaw2 2011-03-04 15:10:41

+0

只是看着它。按钮都释放,工具栏是一个属性。所以不能释放它之间,或者我有内存管理的概念都是错误的? – humblePilgrim 2011-03-04 15:23:43