You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift集成Realm与FolioReaderKit时遇EXC_BAD_ACCESS崩溃求助

解决FolioReaderKit高亮文本时Realm崩溃问题

问题场景

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:55:17