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

iOS开发:UserDefaults能否存储OpaquePointer,Core Data是否可行?

关于OpaquePointer类型持久化的解答

首先明确结论

无论使用UserDefaults还是Core Data,都无法满足你持久化存储OpaquePointer的需求,核心原因是:
OpaquePointer本质是当前应用进程运行时的虚拟内存地址指针,仅在当前进程存活周期内有效。应用重启、进程被系统回收后,之前的指针指向的内存空间已经被释放或重新分配,即使你强行存储了指针的数值,下次读取出来也是无效的野指针,访问会直接触发崩溃。


你当前代码崩溃的原因

NSKeyedArchiver序列化要求被序列化的对象必须遵守NSCoding协议:

  1. 你自定义的LoggerWrapper类既没有继承NSObject,也没有实现NSCoding协议要求的encode(with:)和init(coder:)方法,序列化时会直接抛出异常触发SIGABRT崩溃
  2. 即使你补全了NSCoding相关实现,OpaquePointer本身也不属于可被NSCoding序列化的类型,依然无法完成编码

正确实现方案

你需要存储的不是指针本身,而是可以重建对应实例的可序列化参数:

  • 如果这个OpaquePointer是调用C/C++跨平台库生成的日志实例,你可以存储创建该实例需要的所有配置:比如日志唯一标识、日志存储路径、日志级别、初始化参数等,下次应用启动/视图加载时,用这些存储的参数重新调用初始化接口生成新的OpaquePointer,再存入self.loggers即可
  • 如果你只是需要在视图的生命周期内临时缓存(不需要跨应用重启存储),完全不需要用到持久化方案,直接将loggers放到全局单例类中持有缓存,视图消失再出现时直接从单例读取即可

内容的提问来源于stack exchange,提问作者Aiden0206

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:39:00