熟悉 CoreData 的都知道 NSFetchedResultsController 这个类,与 tableViewcollectionView 结合起来使用非常方便。

但是这个类在 iOS10 中有个比较坑爹的地方,如果使用的是下图的方式初始化

并且传入的 cacheName 不为 nil,那么在 iOS10 下面可能会产生各种莫名其妙的崩溃。详细原因如下图描述:

简单翻译一下就是:修改了 vcfetchRequest 之后,contextsave 操作会打开一个或多个文件描述符,当打开的文件描述符数目超过255(真机)后,后续的资源加载都会导致崩溃。

当初遇到这个问题的时候,整个应用都处于随机崩溃的情况,看日志都是加载 storyboard 或者 xib 等资源时的崩溃,但是死活复现不出来,看崩溃日志也找不到原因。然后无意间发现 Xcode console 中一直不断输出如下警告信息:

(NSFetchedResultsController): couldn't read cache file to update store info timestamps

然后 google 了一下,找到了一个相同的问题,并且有完整的复现 Demo 及复现步骤,然后全局代码搜索果然发现有一个地方初始化的时候传入了 cacheName,将其置 nil 后就再也没有那段 warning 同时上线之后也没有再收到资源加载的崩溃了。

所以 Xcodewarning 还是值的注意的。附上这个 radar链接,里面包含 Demo 地址。

今天再去复现的时候,试了两台 iOS10 的设备,Xcode 9.1iPhone5S iOS10.2 这个 bug 已经不存在了,但是 iPhone7 iOS10.0 还是存在的。