解雇UIActionSheet引起EXC_BAD_ACCESS错误

3

我有一个应用程序,其中包含嵌套在UITabBarController中的UITableView,并且我有一个方法,在从UIActionSheetDelegate方法clickedButtonAtIndex:调用它时会给我一个EXC_BAD_ACCESS。

这个方法有时会出现问题,它被称为updateTaskArray。基本上,它执行一个Core Data提取,配置一个NSMutableArray“taskArray”,它是viewController的一个属性(tableView委托使用它来配置其单元格),然后它的最后一行是

[self.tableView reloadData];

实际情况是,大多数时间它都能正常工作,但只有在从UIActionSheetDelegate调用时才会出现错误。当我使用NSZombieEnabled运行它时,它告诉我:

*** -[UITabBarButton setAlpha:]: message sent to deallocated instance 0x5c2e760

使用断点,在UIActionView委托方法(以及其中的updateTaskArray方法)完成之后,才会发生EXC_BAD_ACCESS。采用以下代码展示UIActionSheet:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

我在思考这是否意味着解除操作表才是问题所在...但是如果我不从委托中调用updateTaskArray,它不会产生任何错误...

我不太确定下一步该怎么做,因为[UITabBarButton setAlpha:]不是我自己调用的方法,而且错误似乎发生在我已经运行的代码之后-有什么建议可以解决这个问题吗?


1
检查你在哪里对tabBarController进行了retainrelease(如果有)。如果在你的.xib文件中加载.xib时没有对它进行retain,你应该这样做 - 比如,在加载.xib的对象中使用@property (retain)来为其视图加载.xib - user244343
tabBarController不是从nib文件中加载的,而是通过编程创建的。它存储在应用程序委托的属性中:@property (nonatomic, retain) UITabBarController *tabBarController;,我从未对其调用释放方法。与之相关的didFinishLaunching代码如下:self.tabBarController = [[UITabBarController alloc ] init]; self.tabBarController.viewControllers = [NSArray arrayWithObjects:nc1, nc2, nil]; - Ascendant
我想到了一个问题,updateTasks确实会改变tableViewController的标题,进而改变tabBarButton的标题(由UITabBarController的默认行为决定),不确定这是否起到了作用。我不确定这是否有任何区别。 - Ascendant
2个回答

2
我已经修改了。
[actionSheet showFromTabBar:self.tabBarController.tabBar];

to

[actionSheet showFromToolbar:self.navigationController.toolbar];

现在它正常运作了。我认为tabBarController是navigation controller的父控制器,它不喜欢我向上多跳一级。


1
如果您在操作表触发的操作中更改了活动选项卡,则似乎会出现此问题。 - ChristophK
+1 给 ChristophK 的评论。我有一个类似的问题;我从操作表按钮模态地显示一个视图。关闭模态视图后,尝试再次显示操作表会导致应用程序崩溃(EXC_BAD_ACCESS)。然而,这个解决方案对我不起作用。 - Joel H.

0

请检查您的释放语句。您正在释放一个UITabBarButton,或者可能是整个选项卡栏,而不应该这样做。请回顾iOS内存管理原则。


我已经阅读了内存管理的原则,但在整个应用程序中,我从未释放过UITabBarButton、tabBar或UItabBarController,因此这些建议似乎并没有太大帮助。我对tabBar本身什么都不做,除了在applicationDidFinishLaunching:withOptions:中使用viewControllers进行初始化,并使用showFromTabBar启动有问题的actionSheet。 - Ascendant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接