我在Foundation的EXC_BAD_ACCESS
方法中遇到了一个奇怪的-[NSData(NSData) getBytes:length:]
崩溃。它经常发生,但我无法从堆栈跟踪中获得任何有意义的信息。除了开源库(getBytes:length:
中的一个和SDWebImage
中的一个)之外,我的代码中没有调用SocketRocket
,但似乎它们不会导致崩溃。
唯一提示是崩溃发生在com.apple.CFNetwork.addPersistCacheToStorageDaemon
线程内,但我不知道它是什么。有人可以帮忙吗?
Thread : Crashed: com.apple.CFNetwork.addPersistCacheToStorageDaemon
0 libsystem_platform.dylib 0x3044a208 _platform_memmove$VARIANT$CortexA9 + 160
1 Foundation 0x22df9167 -[NSData(NSData) getBytes:length:] + 118
2 Foundation 0x22df9167 -[NSData(NSData) getBytes:length:] + 118
3 Foundation 0x22e21a1b -[NSData(NSData) replacementObjectForCoder:] + 134
4 Foundation 0x22dc2aff -[NSXPCEncoder _replaceObject:] + 90
5 Foundation 0x22e240dd -[NSXPCEncoder _encodeArrayOfObjects:forKey:] + 192
6 Foundation 0x22e212ff -[NSDictionary(NSDictionary) encodeWithCoder:] + 922
7 Foundation 0x22dc32c9 -[NSXPCEncoder _encodeObject:] + 604
8 Foundation 0x22dc379d encodeInvocationArguments + 460
9 Foundation 0x22dc3455 -[NSXPCEncoder encodeInvocation:] + 360
10 Foundation 0x22dc32c9 -[NSXPCEncoder _encodeObject:] + 604
11 Foundation 0x22dc2335 -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:timeout:userInfo:] + 1860
12 Foundation 0x22dd2823 -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:] + 58
13 Foundation 0x22dd27db -[_NSXPCDistantObjectWithError forwardInvocation:] + 114
14 CoreFoundation 0x2217e831 ___forwarding___ + 352
15 CoreFoundation 0x220afb88 _CF_forwarding_prep_0 + 24
16 CFNetwork 0x21c52ac9 -[NSURLStorage_CacheClient addCachedResponseWithDictionary:key:] + 120
17 CFNetwork 0x21c21e29 ___ZN12__CFURLCache23CreateAndStoreCacheNodeEP16__CFURLCacheNodePK20_CFCachedURLResponsePK10__CFStringPK13_CFURLRequestPKvbRb_block_invoke + 1576
18 libdispatch.dylib 0x302cf423 _dispatch_call_block_and_release + 10
19 libdispatch.dylib 0x302d95d9 _dispatch_queue_drain$VARIANT$mp + 948
20 libdispatch.dylib 0x302d90a9 _dispatch_queue_invoke$VARIANT$mp + 84
21 libdispatch.dylib 0x302db0d3 _dispatch_root_queue_drain + 330
22 libdispatch.dylib 0x302dc1fb _dispatch_worker_thread3 + 106
23 libsystem_pthread.dylib 0x3044ce25 _pthread_wqthread + 668
另一个(不常发生):
Thread : Crashed: com.apple.CFNetwork.addPersistCacheToStorageDaemon
0 libsystem_platform.dylib 0x000000019344d300 _platform_memmove + 176
1 Foundation 0x0000000182dfce18 -[NSData(NSData) getBytes:length:] + 172
2 Foundation 0x0000000182dfce18 -[NSData(NSData) getBytes:length:] + 172
3 Foundation 0x0000000182e2ae3c -[NSData(NSData) replacementObjectForCoder:] + 160
4 Foundation 0x0000000182dbd320 -[NSXPCEncoder _replaceObject:] + 120
5 Foundation 0x0000000182e2dac8 -[NSXPCEncoder _encodeArrayOfObjects:forKey:] + 256
6 Foundation 0x0000000182e2a544 -[NSDictionary(NSDictionary) encodeWithCoder:] + 1016
7 Foundation 0x0000000182dbdd10 -[NSXPCEncoder _encodeObject:] + 716
8 Foundation 0x0000000182dbe2e8 encodeInvocationArguments + 508
9 Foundation 0x0000000182dbdee4 -[NSXPCEncoder encodeInvocation:] + 412
10 Foundation 0x0000000182dbdd10 -[NSXPCEncoder _encodeObject:] + 716
11 Foundation 0x0000000182dbcb0c -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:timeout:userInfo:] + 2196
12 CoreFoundation 0x0000000181fde230 ___forwarding___ + 440
13 CoreFoundation 0x0000000181ee2b6c _CF_forwarding_prep_0 + 92
14 CFNetwork 0x000000018199c908 ___ZN12__CFURLCache23CreateAndStoreCacheNodeEP16__CFURLCacheNodePK20_CFCachedURLResponsePK10__CFStringPK13_CFURLRequestPKvbRb_block_invoke + 1976
15 libdispatch.dylib 0x00000001932793ac _dispatch_call_block_and_release + 24
16 libdispatch.dylib 0x000000019327936c _dispatch_client_callout + 16
17 libdispatch.dylib 0x00000001932834c0 _dispatch_queue_drain + 1216
18 libdispatch.dylib 0x000000019327c474 _dispatch_queue_invoke + 132
19 libdispatch.dylib 0x0000000193285224 _dispatch_root_queue_drain + 664
20 libdispatch.dylib 0x000000019328675c _dispatch_worker_thread3 + 108
21 libsystem_pthread.dylib 0x00000001934552e4 _pthread_wqthread + 816
答案 0 :(得分:3)
随着iOS 8的推出,还会出现一些意想不到的错误,我们也要记住这一点。
像麻省理工学院移动,Mile这样的应用程序也遇到了像你这样的问题,截至目前,这个问题并没有广泛传播。 com.apple.CFNetwork.addPersistCacheToStorageDaemon
CFNetwork是较低级别的C API,它由NSURLConnection等更高级别的类包装。
因此在网络操作期间发生崩溃
EXC_BAD_ACCESS
这意味着消息被发送到一个内存地址,其中没有类的实例来执行它。因此导致“访问不良”
什么时候会发生?
我们如何解决这个问题?
启用NSZombie:
启用此功能后,虚拟对象(僵尸)将保留在每个已释放对象的位置,从而允许调试已释放的对象。非常容易启用:
现在不是想知道发生了什么以及哪个确切的对象产生了问题,你就会明确地看到哪个类是麻烦制造者,你会很快调试它。
注意: 当您将应用程序提交到App Store时,请不要启用僵尸。此外,如果您真的不需要它们,最好禁用它们。
注意:
我的建议是永远不要使用第三方框架,除非它不可避免,因为库本身有时会出现开发人员控制的错误,有时库会在当前SDK的后期更新。你可以找到更多关于它的信息here
希望这有帮助
答案 1 :(得分:2)
我的猜测是你有
__unsafe_unretained
(对于setter Path来说是unavoidable
[NSInvocation setArgument:atIndex:]
)performBlockAndWait
期间一些相关的建议:
1)NSManagedObject
,NSManagedObjectContext
和NSPersistentStoreCoordinator
(假设addPersistCacheToStorageDaemon
崩溃)不是线程安全的:
performBlockAndWait
发送消息,请考虑这一点
到NSManagedObjectContext
(更多here和nested MOC)或
{{3}}。 2)CFNetwork
是由NSURLConnection
包裹的低级类:
NSURL
?避免addObserver:self forKeyPath
(KVO)
到NSURL会议的财产?答案 2 :(得分:2)
问题实际上可能来自SDWebImage 引用本网站:
现在,如果您使用AFNetworking使用AFNetworking类别直接从URL设置图像,您可能需要使用备用方法,以便可以干预图像并调整图像大小。下面的代码就是这样。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:imageURL];
[request addValue:@"image/*" forHTTPHeaderField:@"Accept"];
[imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// resize image
// set image on imageView
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
// handle error
}];
我还会检查此页面是否存在相关崩溃:
https://github.com/rs/SDWebImage/issues?q=is%3Aopen+is%3Aissue+label%3Acrash
检查您是否使用最新版本的SDWebImage,否则您可能需要检查较旧的问题。