IOS4.2 应用程序以 EXC_BAD_ACCESS 退出

Posted

技术标签:

【中文标题】IOS4.2 应用程序以 EXC_BAD_ACCESS 退出【英文标题】:IOS4.2 app quits with EXC_BAD_ACCESS 【发布时间】:2010-12-08 08:44:08 【问题描述】:

ios3 下运行良好的 iPad 应用程序在 IOS4.2 下失败。它有一个从操作队列运行 http 会话的类,并且失败与此活动相关联。这是控制台输出:

Program received signal:  “EXC_BAD_ACCESS”.
[Switching to thread 11523]

运行 NSZombies 启用并没有显示任何内容,因此我一直将 NSLog 语句放入代码中,发现当局部变量更改时会发生崩溃。这是代码部分:

self.currentOperation = [[[DeduceAccessOperation alloc] init] autorelease];
[self.currentOperation addObserver:self forKeyPath:@"isFinished"
 options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
 context:NULL];
NSLog (@"Start observer added");    
[operationQueue addOperation:self.currentOperation];
NSLog (@"Start operation added");
NSLog(@"State is %d", self.status);
self.status = IEnablerServiceUpdating;
NSLog (@"State updated");

这是控制台日志输出:

2010-12-08 21:26:44.548 UCiEnabler[5180:307] Start observer added
2010-12-08 21:26:44.550 UCiEnabler[5180:307] Start operation added
2010-12-08 21:26:44.552 UCiEnabler[5180:307] State is 1
Program received signal:  “EXC_BAD_ACCESS”.
[Switching to thread 11523]

就像 status 变成了只读的(它的属性被声明为 atomic 和 readwrite)。

另一条相关信息是子视图刚刚被更改,它触发了对上述例程的调用。它的代码是:

//Start the update      
UCiEnablerAppDelegate *controller = (UCiEnablerAppDelegate *)[[UIApplication sharedApplication] delegate];
[controller deduceIEnablerServiceAccess];
controller.serviceBusy = TRUE; //1.04

有人见过这样的吗?

有人知道下一步该去哪里吗?

问候 罗宾

这是堆栈跟踪:

#0  0x34a80464 in objc_msgSend
#1  0x3119543e in NSKVOPendingNotificationCreate
#2  0x3119535a in NSKeyValuePushPendingNotificationPerThread
#3  0x3117009a in NSKeyValueWillChange
#4  0x311682c6 in -[NSObject(NSKeyValueObserverNotification) willChangeValueForKey:]
#5  0x311cc718 in _NSSetIntValueAndNotify
#6  0x000097ce in -[IEnablerService startDeducingAccessState] at IEnablerService.m:55
#7  0x00002bc0 in -[UCiEnablerAppDelegate deduceIEnablerServiceAccess] at UCiEnablerAppDelegate.m:100
#8  0x0000a33e in -[RootViewControlleriPad animationDidStop:finished:context:] at RootViewController-iPad.m:43
#9  0x341bb336 in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]

【问题讨论】:

以后检查您的问题以确保代码格式正确。 另外,在调试器中运行它,获取堆栈跟踪并在此处发布。 没有机会为导致崩溃的状态自定义设置器?如果在该行设置断点并进入 self.status = IEnablerServiceUpdating 会发生什么? @Rog:可能是。我在想一些 KVO 被绊倒了,这就是为什么我想查看堆栈跟踪。 【参考方案1】:

iOS 4.2 中的NSOperationQueue 现在在启动NSOperations 时使用GrandCentralDispatch。 There's a Technical Q&A here

无论isConcurrent 属性如何,队列现在几乎都会在新线程中调用NSOperation 子类的start 方法。根据我的经验,这意味着如果您在 start 方法中使用 NSURLConnection,您的代码将不再运行,因为正在运行的线程 start 没有 NSRunLoop

Apple 表示此更改不会破坏兼容性,因为无论如何您都应该在 start 方法中生成一个新线程。

为了向后兼容,您应该将子类从使用 start 更改为使用 run

【讨论】:

我对 GCD 的研究表明它适用于调度队列(并发指南 p13)而不是操作队列。但是 NSURLConnections 应该从操作队列中运行。但由于 iOS3 更好的调用方式是通过异步 API 调用。但是我不愿意/无法修改代码,因为我无法访问环境来全面测试它。啊啊啊!

以上是关于IOS4.2 应用程序以 EXC_BAD_ACCESS 退出的主要内容,如果未能解决你的问题,请参考以下文章

在ios4.2中隐藏带有动画的uiview

system("killall SpringBoard");不能在 ios4.2.1 中工作?

如何让我的 iOS4.2 SDK 开发代码与 iOS3.1.3 一起工作?

带有 customView 的 UIBarButtonItem 在 iOS4.1 中消失了

iOS 4 中的 UINavigationBar 色调颜色闪烁

允许 AirPlay 支持和 iOS 4.2、iOS 4.3