【发布时间】:2014-06-27 18:48:24
【问题描述】:
试图找出我在生产版本中看到的问题的根源,并且最终能够在测试时重现它。使用 RestKit v0.23.1,当使用以下代码执行 RKManagedObjectRequestOperation 时(插入仪器时)我得到“一个 Objective-C 消息被发送到一个已释放的 'NSError' 对象(僵尸)”并且应用程序在每次有对象时崩溃响应 JSON - 如果响应类似于“objects = ();”没有崩溃 - 所以我猜它在 RestKit/Core Data 映射或存储中的某个地方?
RKManagedObjectRequestOperation *objectRequestOperation = [_objectManager managedObjectRequestOperationWithRequest:request managedObjectContext:_objectManager.managedObjectStore.mainQueueManagedObjectContext success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
DDLogInfo(@"INSIDE SUCCESS BLOCK");
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
DDLogInfo(@"INSIDE ERROR BLOCK");
}];
[objectRequestOperation setWillMapDeserializedResponseBlock:^id(id deserializedResponseBody) {
DDLogInfo(@"Response JSON: %@", deserializedResponseBody);
return deserializedResponseBody;
}];
objectRequestOperation.savesToPersistentStore = YES;
[objectRequestOperation start];
原始 JSON 已正确记录在 setWillMapDeserializedResponseBlock 中,但从未到达成功和错误块中的日志。这是我从 crashlytics 得到的堆栈跟踪:
Thread : Crashed: NSOperationQueue Serial Queue
0 libobjc.A.dylib 0x37dd4626 objc_msgSend + 5
1 Foundation 0x2df5802d -[NSError dealloc] + 60
2 libobjc.A.dylib 0x37dd9b6b objc_object::sidetable_release(bool) + 174
3 libobjc.A.dylib 0x37dda0d3 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 358
4 CoreFoundation 0x2d569501 _CFAutoreleasePoolPop + 16
5 Foundation 0x2df69999 -[__NSOperationInternal _start:] + 1064
6 Foundation 0x2e00d745 __NSOQSchedule_f + 60
7 libdispatch.dylib 0x382b8cbd _dispatch_queue_drain + 488
8 libdispatch.dylib 0x382b5c6f _dispatch_queue_invoke + 42
9 libdispatch.dylib 0x382b95f1 _dispatch_root_queue_drain + 76
10 libdispatch.dylib 0x382b98dd _dispatch_worker_thread2 + 56
11 libsystem_pthread.dylib 0x383e4c17 _pthread_wqthread + 298
【问题讨论】:
-
所以你是在后台线程上运行它,但使用主线程上下文?
-
这只会从主线程调用。
-
是否有一些基于堆栈跟踪的东西或者让你认为它在后台线程中的东西,或者是基于我们上周在前一个线程中的对话?
-
对不起,我不记得之前的对话了,但是堆栈跟踪从大量调度队列和工作线程的东西开始。如果您在主线程上显式启动操作,那么它应该在主线程上运行,尽管它可能会创建在(私有)操作队列上运行的其他操作(用于映射)。您无法从 Xcode 复制运行的糟糕透顶。您能否显示导致崩溃的映射和示例 JSON。
-
这不在主线程上运行。您的问题是 NSError 正在被自动释放,然后发送了一条消息。如果不看 RestKit 的代码,它可能与那个“故障块”的内存管理有关。设计的保留周期很糟糕。
标签: ios core-data restkit dealloc nserror