我刚刚向一个库添加了一个新的TestCase,现在我的测试突然崩溃了一个奇怪的堆栈跟踪:
* thread #1: tid = 0x2e4275, 0x007a80b2 libobjc.A.dylib`objc_msgSend + 14, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x202989c2)
* frame #0: 0x007a80b2 libobjc.A.dylib`objc_msgSend + 14
frame #1: 0x05fc88ac CoreData`-[_CDSnapshot dealloc] + 92
frame #2: 0x05fc6fed CoreData`-[_CDSnapshot release] + 77
frame #3: 0x05fd1c34 CoreData`-[NSManagedObject(_NSInternalMethods) _clearRawPropertiesWithHint:] + 356
frame #4: 0x05fd1a3b CoreData`-[NSFaultHandler turnObject:intoFaultWithContext:] + 411
frame #5: 0x06006d1b CoreData`-[NSManagedObjectContext(_NSInternalAdditions) _disposeObjects:count:notifyParent:] + 395
frame #6: 0x06006392 CoreData`-[NSManagedObjectContext(_NSInternalAdditions) _dispose:] + 578
frame #7: 0x06005e5f CoreData`-[NSManagedObjectContext _dealloc__] + 319
frame #8: 0x06005cf6 CoreData`-[NSManagedObjectContext dealloc] + 70
frame #9: 0x05fc8ced CoreData`-[NSManagedObjectContext release] + 77
frame #10: 0x007a8e97 libobjc.A.dylib`objc_release + 71
frame #11: 0x007a8e3e libobjc.A.dylib`objc_storeStrong + 39
frame #12: 0x02e7a58d MyLibTests`-[M2BCoreDataManager .cxx_destruct](self=0x0287c0d0, _cmd=0x007ae6b7) + 221 at M2BCoreDataManager.m:19
frame #13: 0x007972d4 libobjc.A.dylib`object_cxxDestructFromClass(objc_object*, objc_class*) + 128
frame #14: 0x0079724f libobjc.A.dylib`object_cxxDestruct + 20
frame #15: 0x007a227a libobjc.A.dylib`objc_destructInstance + 48
frame #16: 0x007a22ab libobjc.A.dylib`object_dispose + 20
frame #17: 0x007a9692 libobjc.A.dylib`objc_object::sidetable_release(bool) + 268
frame #18: 0x007a8e81 libobjc.A.dylib`objc_release + 49
frame #19: 0x007a9ce7 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 537
frame #20: 0x20103dbe XCTest`-[XCTestCase performTest:] + 178
frame #21: 0x20104c48 XCTest`-[XCTest run] + 82
frame #22: 0x201033e8 XCTest`-[XCTestSuite performTest:] + 139
frame #23: 0x20104c48 XCTest`-[XCTest run] + 82
frame #24: 0x201033e8 XCTest`-[XCTestSuite performTest:] + 139
frame #25: 0x20104c48 XCTest`-[XCTest run] + 82
frame #26: 0x201033e8 XCTest`-[XCTestSuite performTest:] + 139
frame #27: 0x20104c48 XCTest`-[XCTest run] + 82
frame #28: 0x201066ba XCTest`+[XCTestProbe runTests:] + 183
frame #29: 0x007aa743 libobjc.A.dylib`+[NSObject performSelector:withObject:] + 70
frame #30: 0x0000233e xctest`___lldb_unnamed_function9$$xctest + 195
frame #31: 0x00002590 xctest`___lldb_unnamed_function11$$xctest + 246
frame #32: 0x00002671 xctest`___lldb_unnamed_function12$$xctest + 52
frame #33: 0x00002007 xctest`___lldb_unnamed_function2$$xctest + 45
与我的代码相关的唯一一行是第12帧。
M2BCoreDataManager是我在所有测试用例中用来设置CoreData堆栈的简单助手类的超类。
在进行更改之前,我有4个不同的类测试将JSON解析为我的CoreData模型对象。其中每个都创建了一个M2BCoreDataManager子类的实例,以使用库的CoreData模型文件和测试用例的特殊存储位置来设置CoreDataStack。
在崩溃发生之前我所做的就是为另一个模型类添加第5个测试用例,并复制(并稍微修改)其中一个测试用例。 我做了一件事:我删除了Derived Data文件夹,因为Xcode使用旧版本的CoreData模型进行测试,并将模型文件添加到测试目标。不确定这是否与它有关。
我认为崩溃与测试用例tearDown
有关,因为我从新测试中得到测试失败,因此测试似乎已经运行,但它仍然崩溃。
崩溃听起来好像与过度发布有关,所以我尝试在库运行方案配置中启用NSZombie,但我不确定在运行测试时是否有效。至少它没有改变任何东西。我不知道还有什么可以尝试或问题的原因是什么。
我的每个与核心数据相关的测试案例都是这样的:
@interface GREmailJSONInitialization : XCTestCase
@property (strong) GRCoreDataModelTestsHelper *coreDataHelper;
@end
@implementation GREmailJSONInitialization
- (void)setUp
{
self.coreDataHelper = [[GRCoreDataModelTestsHelper alloc] initWithTestStoreName:@"NoteInitializationTest"];
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
}
- (void)tearDown
{
// Put teardown code here. This method is called after the invocation of each test method in the class.
NSError *cleanUpError = nil;
BOOL cleanUp = [[NSFileManager defaultManager] removeItemAtURL:self.coreDataHelper.testStoreURL error:&cleanUpError];
if (!cleanUp)
{
XCTFail(@"Could not clean up temporary store due to error: %@", cleanUpError);
}
self.coreDataHelper = nil;
[super tearDown];
}
GRCoreDataModelTestHelper
是M2BCoreDataManager的子类。它所做的就是指定一个模型URL和一个在设置CoreData堆栈时使用的商店URL。
我所做的就是在设置上创建GRCoreDataModelTestHelper
并删除tearDown上的PersistentStore文件,同时通过将属性设置为nil来删除GRCoreDataModelTestHelper
。我在那里设置了一个断点,self.coreDataHelper = nil;
不会导致崩溃,它已成功执行。
任何想法可能是什么原因或指示还有什么可以追查问题?
编辑:所以问题本身就消失了,但我不知道发生了什么或者我改变了什么......