测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布最后发布 | 2016年11月 |
由 Graham Dennis 维护。
GDCoreDataConcurrencyDebugging 帮助您找到在错误的线程或 dispatch queue 上调用 NSManagedObject 的情况。只需将其添加到您的项目中,您将得到对每个 NSManagedObject 无效访问的日志消息。
例如,以下代码将触发控制台消息
__block NSManagedObject *objectInContext1 = nil;
[context1 performBlockAndWait:^{
objectInContext1 = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:context1];
objectInContext1.name = @"test";
[context1 save:NULL];
}];
// Invalid access
NSString *name = objectInContext1.name;
如果您想要自定义日志记录,可以调用 GDCoreDataConcurrencyDebuggingSetFailureHandler
来设置自己的并发失败处理程序,其函数原型为 void ConcurrencyFailureHandler(SEL _cmd);
。例如
#import <GDCoreDataConcurrencyDebugging/GDCoreDataConcurrencyDebugging.h>
static void CoreDataConcurrencyFailureHandler(SEL _cmd)
{
// Simply checking _cmd == @selector(autorelease) won't work in ARC code.
// You really shouldn't ignore -autorelease messages sent on the wrong thread,
// but if you want to live on the wild side...
if (_cmd == NSSelectorFromString(@"autorelease")) return;
NSLog(@"CoreData concurrency failure: Selector '%@' called on wrong queue/thread.", NSStringFromSelector(_cmd));
}
int main()
{
GDCoreDataConcurrencyDebuggingSetFailureHandler(CoreDataConcurrencyFailureHandler);
}
请参阅我的 博客文章 了解更多信息。
要运行示例项目;克隆存储库,首先从项目目录中运行 pod install
。示例演示了某些无效的 CoreData 代码。一个特别棘手的例子是当 autorelease pool 在拥有 NSManagedObjectContext
被重置或 dealloc'ed 后弹出时。
Mac OS X 10.6+,iOS 3.1+,JRSwizzle
如果您是手动安装,请务必确保对于 GDCoreDataConcurrencyDebugging 源代码禁用 ARC(使用 -fno-objc-arc
标志)。GDCoreDataConcurrencyDebugging 可以安全地与 ARC 代码连接。请参阅示例。
GDCoreDataConcurrencyDebugging 使用动态子类化来创建一个定制的 NSManagedObject
子类,该子类跟踪对实例变量的访问以及何时修改。请注意,GDCoreDataConcurrencyDebugging 不检查从 NSManagedObject 恢复后,用于关系的 CoreData faulting 集合是否正确访问。
GDCoreDataConcurrencyDebugging 基于Mike Ash的动态子类化代码MAZeroingWeakRef。
Graham Dennis,[email protected]
GDCoreDataConcurrencyDebugging 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。