GDCoreDataConcurrencyDebugging 0.4

GDCoreDataConcurrencyDebugging 0.4

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2016年11月

Graham Dennis 维护。



  • 作者:
  • 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 文件。