- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个奇怪的问题,我不知道这是我的错误(最有可能)还是 UINavigationController 中的错误。
我在我的应用程序中使用 UINavigationController。在某些情况下,我需要复杂的导航,例如“弹出 2 个屏幕并推送新的屏幕”。目前我通过获取当前navigationController.viewControllers
来做到这一点,修改集合,并调用[navigationController setViewControllers:newStack animated:YES]
.
这使得我的应用程序经常崩溃。通常崩溃是 SIGBUS 或 SIGSEGV。重现步骤如下:
有趣的是:
[navigationController popToRootViewControllerAnimated:NO]
在更新堆栈之前,应用程序不会崩溃,或者至少崩溃的情况要少得多(我无法重现崩溃)。我的信号处理程序捕获的崩溃堆栈跟踪示例:
- 0x0027a9 mysighandler()
- 0x3293d82b _sigtramp()
- 0x31c59065 -[UIApplication sendAction:to:from:forEvent:]
- 0x31c59005 -[UIApplication sendAction:toTarget:fromSender:forEvent:]
- 0x31c58fd7 -[UIControl sendAction:to:forEvent:]
- 0x31c58d31 -[UIControl _sendActionsForEvents:withEvent:]
- 0x31c59645 -[UIControl touchesEnded:withEvent:]
- 0x31c5865d -[UIWindow _sendTouchesForEvent:]
- 0x31c58039 -[UIWindow sendEvent:]
- 0x31c5492f -[UIApplication sendEvent:]
- 0x31c543a7 _UIApplicationHandleEvent()
- 0x3352c9ed PurpleEventCallback()
- 0x3358ac2d CFRunLoopRunSpecific()
- 0x3358a35d CFRunLoopRunInMode()
- 0x3352bb33 GSEventRunModal()
- 0x3352bbdf GSEventRun()
- 0x31c1976f -[UIApplication _run]
- 0x31c18473 UIApplicationMain()
- 0x00214d main()
- 0x0020c4 start()
另一个:
- 0x002945 mysighandler()
- 0x3293d82b _sigtramp()
- 0x31c5ead3 -[UIScrollView _updatePanWithStartDelta:event:gesture:ignoringDirectionalScroll:]
- 0x31c5e435 -[UIScrollView handlePan:]
- 0x31d14651 -[UITableView handlePan:]
- 0x33590da7 -[Protocol performSelector:withObject:]
- 0x31c428b5 -[UIGestureRecognizer _updateGestureWithEvent:]
- 0x31c427a9 -[UIGestureRecognizer _updateGestureStateWithEvent:afterDelay:]
- 0x31c583d5 -[UIWindow _sendGesturesForEvent:]
- 0x31c5802b -[UIWindow sendEvent:]
- 0x31c5492f -[UIApplication sendEvent:]
- 0x31c543a7 _UIApplicationHandleEvent()
- 0x3352c9ed PurpleEventCallback()
- 0x3358ac2d CFRunLoopRunSpecific()
- 0x3358a35d CFRunLoopRunInMode()
- 0x3352bb33 GSEventRunModal()
- 0x3352bbdf GSEventRun()
- 0x31c1976f -[UIApplication _run]
- 0x31c18473 UIApplicationMain()
- 0x0022e9 main()
- 0x002260 start()
“复杂”导航实现示例:
@implementation UINavigationController(MyCategory)
- (void)popViewControllers:(NSInteger)count {
NSArray* oldList = self.viewControllers;
NSMutableArray* newList = [NSMutableArray arrayWithArray:oldList];
if(count > [oldList count]) {
CLogError(@"Poping %d screens when there is only %d", count, [oldList count]);
count = [oldList count] - 1;
}
for(int i = 0; i<count; i++) {
[newList removeLastObject];
}
[self setViewControllers:newList animated:YES];
}
@end
现在有人知道我可能做错了什么吗?我已经没有主意了。
添加:
我确实使用 NSZombieEnabled 和 MallocStackLogging 运行我的应用程序来找出失败的对象。然而它并没有给出我合理的结果。对于堆栈跟踪 #1,它在步骤 3 失败 ( -[UIApplication sendAction:to:from:forEvent:]
) 并且僵尸对象是 -[UIBarButtonItem performSelector:withObject:withObject:]: message sent to deallocated instance 0xa5f5f90
。这是应用程序从 2 个屏幕返回的屏幕的右侧导航栏按钮(请记住,此 2 个屏幕返回导航有效,只有下一个“通常”返回导航失败)。但我没有用那个按钮做任何事情。对应代码在ViewControler的initWithSomething:(Something*)something
是:
UIBarButtonItem* doneItem = [[UIBarButtonItem alloc] initWithTitle:@"Complete"
style:UIBarButtonItemStyleDone
target:self action:@selector(onDone)];
self.navigationItem.rightBarButtonItem = doneItem;
[doneItem release];
这个按钮唯一特别的地方是 onDone
选择器执行 2 个屏幕后退导航,但我认为这并不重要。所以我相信更高级别的对象(可能是 View Controller 或 UINavigationController?)有问题。但出了什么问题呢?
2011 年 10 月 4 日添加:
由于人们有时仍然在搜索这个问题,这里有一些代码。我当前解决此问题的方法是使用 UINavigationController 的自定义子类,而不是通过以下 hack 来代替它(不保证这有效或仍然必要):
@interface CustomUINavigationController : UINavigationController {
}
@end
@implementation CustomUINavigationController
- (void)setViewControllers:(NSArray*)newStack animated:(BOOL)animated {
// HACK HACK
// Somehow everything fails if I don't clean stack before putting new
// But on iOS4 popToRootViewControllerAnimated might call setViewControllers:animated
// let's avoid call stack overflow
static int stackCount = 0;
if(!stackCount++) {
if([self.viewControllers count] != 1) {
[self popToRootViewControllerAnimated:NO];
}
else {
UIViewController* tmpVc = [[[UIViewController alloc] init] autorelease];
NSArray* tmpStack = [NSArray arrayWithObject:tmpVc];
[super setViewControllers:tmpStack animated:NO];
}
}
[super setViewControllers:newStack animated:animated];
stackCount--;
}
@end
另一件重要的事情:当之前的动画导航仍在进行时,最好不要启动动画导航(即至少在调用 viewWillAppear: 之前)。
最佳答案
我认为在僵尸模式下通过 Instruments 运行它是值得的。这几乎肯定是一个内存问题,因为某些东西访问了已经释放的对象。
关于iphone - UINavigationController setViewControllers 导致应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2357698/
我有一段代码看起来像这样: void update_clock(uint8_t *time_array) { time_t time = *((time_t *) &time_array[0]
应用程序崩溃了 :( 请帮助我.. 在这方面失败了。我找不到错误?该应用程序可以连接到 iTunesConnect 但它会出错。 谁能根据下面的崩溃报告判断问题出在哪里? share_with_app
小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就
我正在创建一个函数,它将目录路径作为参数传递,或者如果它留空,则提示用户输入。 我已经设置了我的 PATH_MAX=100 和 if 语句来检查 if ((strlen(folder path) +
我已将“arial.ttf”文件(从我的/Windows/Fonts 文件夹中获取)加载到内存中,但是将其传递到 FT_New_Memory_Face 时会崩溃(在 FT_Open_Face 中的某处
我正在尝试在我的计算机上的两个控制台之间进行 rtsp 流。 在控制台 1 上,我有: ffmpeg -rtbufsize 100M -re -f dshow -s 320x240 -i video=
我正在尝试使用 scio_beast在一个项目中。我知道它还没有完成,但这并不重要。我已经设法让它工作得很好。 我现在正在尝试连接到 CloudFlare 后面的服务器,我知道我需要 SNI 才能工作
我有一个带有关联宏的下拉列表,如下所示: Sub Drop() If Range("Hidden1!A1") = "1" Then Sheets("Sheet1").Se
我对 bash 很陌生。我要做的就是运行这个nvvp -vm /usr/lib64/jvm/jre-1.8.0/bin/java无需记住最后的路径。我认为 instafix 就是这样做...... n
我在 Windows 上使用 XAMPP 已经两年左右了,它运行完美,没有崩溃没有问题。 (直到四个月前。) 大约四个月前,我们将服务器/系统升级到了更快的规范。 这是旧规范的内容 - Windows
我面临着一个非常烦人的 android 崩溃,它发生在大约 1% 的 PRODUCTION session 中,应用程序始终在后台运行。 Fatal Exception: android.app.Re
尝试使用下面的函数: public void createObjectType() { try { mCloudDB.createObjectType(ObjectTypeIn
由于我正在进行的一个项目,我在 CF11 管理员中弄乱了类路径,我设法使服务器崩溃,以至于我唯一得到的是一个漂亮的蓝屏和 500 错误.我已经检查了日志,我会把我能做的贴在帖子的底部,但我希望有人会启
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 10 个月前关闭。 Improve
我最近从 xcode 3.x 更新到 4.2,当我在 4.2 中运行应用程序时,我遇到了核心数据问题。我还更新到了 iOS 5,所以问题可能就在那里,我不太确定。 这些应用程序在 3.x 中运行良好,
我是一个相对较新的 iPhone 应用程序开发人员,所以我的知识有点粗略,所以如果这是一个微不足道的问题,请原谅我。 我有一个导航应用程序,它通过在navigationController对象上调用p
if ([MFMailComposeViewController canSendMail]) { MFMailComposeViewController *mailViewController
你能帮我吗? 我正在设置 UILocalNotification,当我尝试设置其 userInfo 字典时,它崩溃了。 fetchedObjects 包含 88 个对象。 这是代码: NSDi
为什么我的代码中突然出现 NSFastEnumeration Mutation Handler 崩溃。我很茫然为什么会突然出现这个崩溃以及如何解决它。 最佳答案 崩溃错误: **** 由于未捕获的异常
当我从表中删除行时,我的应用程序崩溃了。这是我检测到错误和堆栈跟踪的来源。谢谢! //delete row from database - (void)tableView:(UITableView *
我是一名优秀的程序员,十分优秀!