Swift集成Realm与FolioReaderKit时遇EXC_BAD_ACCESS崩溃求助
问题场景
通过CocoaPods安装FolioReaderKit读取epub书籍,尝试高亮文本并添加到高亮列表时,应用崩溃,抛出错误:Thread 1: EXC_BAD_ACCESS (code=257, address=0x41c4a1c96ae55d46)
崩溃发生在RLMAccessor.mm文件的以下代码行:
value = RLMGetOptional(static_cast<RLMOptionalBase *>(object_getIvar(obj, prop.swiftIvar)));
对应完整函数代码:
id RLMAccessorContext::propertyValue(__unsafe_unretained id const obj, size_t propIndex, __unsafe_unretained RLMProperty *const prop) { // Property value from an NSArray if ([obj respondsToSelector:@selector(objectAtIndex:)]) { return propIndex < [obj count] ? [obj objectAtIndex:propIndex] : nil; } // Property value from an NSDictionary if ([obj respondsToSelector:@selector(objectForKey:)]) { return [obj objectForKey:prop.name]; } // Property value from an instance of this object type id value; if ([obj isKindOfClass:_info.rlmObjectSchema.objectClass] && prop.swiftIvar) { if (prop.array) { return static_cast<RLMListBase *>(object_getIvar(obj, prop.swiftIvar))._rlmArray; } else if (prop.swiftIvar == RLMDummySwiftIvar) { // FIXME: An invalid property which we're pretending is nil until 4.0 return NSNull.null; } else { // optional value = RLMGetOptional(static_cast<RLMOptionalBase *>(object_getIvar(obj, prop.swiftIvar))); } } else { // Property value from some object that's KVC-compatible value = RLMValidatedValueForProperty(obj, [obj respondsToSelector:prop.getterSel] ? prop.getterName : prop.name, _info.rlmObjectSchema.className); } return value ?: NSNull.null; }
解决方法
匹配Realm版本兼容性:FolioReaderKit对Realm版本有依赖要求,版本不匹配是这类崩溃的常见原因。打开
Podfile,指定与当前FolioReaderKit兼容的Realm版本,例如:pod 'FolioReaderKit' pod 'Realm', '~> 10.30.0' pod 'RealmSwift', '~> 10.30.0'执行
pod update重新安装依赖。清理缓存重建项目:先执行
pod deintegrate && pod install清理旧Pod依赖并重新安装;再在Xcode中执行Product > Clean Build Folder,重启Xcode后重新运行项目。保证线程安全:Realm对象只能在创建它的线程访问,若高亮操作在非主线程执行,易触发野指针问题。确保所有涉及Realm的高亮逻辑在主线程处理,示例:
DispatchQueue.main.async { // 执行高亮添加逻辑 }绕过内置Realm管理:如果上述方法无效,可自定义高亮存储逻辑,实现
FolioReaderHighlightDelegate协议,手动处理高亮的保存与读取,不依赖FolioReaderKit默认的Realm数据库。升级FolioReaderKit:旧版本可能存在Realm相关bug,执行
pod update FolioReaderKit升级到最新稳定版,新版本通常会修复这类兼容性问题。
内容的提问来源于stack exchange,提问作者user291334

