持久化自定义对象

2023-12-28

我有一个简单地继承自 NSObject 的自定义对象。它有 3 个成员 - 两个花车和一个NSDate.

我的应用程序将有一个数组,其中包含许多这些对象,并且我需要在运行之间保留它。我怎样才能做到这一点?

我考虑过使用 SQLite 数据库,但我认为这有点矫枉过正,因为我做过的唯一查询是select *.

在理想的情况下,我想使用 xml plist 文件。我不确定我是否可以用我的自定义对象来做到这一点。我知道有一组属性列表对象,并且NSArray属于这个范围,但是writeToFile:atomically:仅适用于属性列表对象。

任何想法将不胜感激,谢谢!


NSCoding会做你想做的事。我建议您阅读 Apple 文档,但我认为它使用起来非常简单。您的班级(以及任何子班级)将需要实施NSCoding协议,你需要添加-encodeWithCoder: and -initWithCoder:对象的方法。大多数常见的框架类都实现了NSCoding已经。

您的类的代码将如下所示:

-(void) encodeWithCoder: (NSCoder*) coder {
  [coder encodeInteger: versionValue forKey: versionKey];
  [coder encodeObject: myStuff forKey: myStuffKey];
}

-(id) initWithCoder: (NSCoder*) coder {
  self = [super init];
  if ( ! self) return nil;
  myStuff = [[coder decodeObjectForKey: myStuffKey] retain];
  return self;
}

建议您在编码时添加版本号,以便您灵活地管理未来版本中存档格式的更改。

在我的课堂上,我添加了一个方便的方法来归档我的对象:

-(void) archiveToFile: (NSString*) path {
  NSMutableData *data = [[NSMutableData alloc] init];
  NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data];
  [archiver encodeObject: self forKey: myArchiveKey];
  [archiver finishEncoding];
  [archiver release];
  [data writeToFile: path atomically: YES];
  [data release];
}

另一个用于取消归档或创建新对象:

+(MyArchive*) newFromFile: (NSString*) path
            orWithMyStuff: (MyStuff*) myStuff
{
  NSData *data = [[NSData alloc] initWithContentsOfFile: path];
  NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data];
  MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey];
  [unarchiver finishDecoding];

  if (myArchive) {
    [myArchive retain];
  } else {
    myArchive = [[MyArchive alloc] initWithStuff: myStuff;
  }
  [unarchiver release];
  [data release];
  return myArchive;
}

由于您的顶级对象是NSArray,您需要根据您的情况修改最后两个方法,但大多数样板代码将是相同的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

持久化自定义对象 的相关文章

  • 使用 iPhone 摄像头检测心率 [重复]

    这个问题在这里已经有答案了 可能的重复 使用摄像头检测心率 https stackoverflow com questions 9274027 detecting heart rate using the camera 我正在研究 iOS
  • 如何在 ios 7 上更改重新排序控制图像

    我正在寻找一种更改重新排序控件图像和大小的方法 我使用此代码来更改重新排序图像 void tableView UITableView tableView willDisplayCell UITableViewCell cell forRow
  • UIWebView 中的 PDF

    我正在创建一个杂志应用程序 我在 UIWebView 中显示杂志的每一页 不过 Web 视图不会用 PDF 填满屏幕 它周围有一个边界 我怎样才能全屏显示它 我还没有使用 UIWebView 尝试过此操作 但您也许可以执行类似的操作来以编程
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • iPhone 崩溃日志?

    我已经配置了一部 iPhone 并让用户安装了该应用程序 它失败 是否有崩溃日志可以让我看到 iPhone 上失败的原因 Ian 如果您可以使用 xcode 将 iPhone 连接到计算机 则在管理器窗口中它会显示每个应用程序崩溃的崩溃日志
  • GMSMapView 中的倒多边形

    我必须在我的 iPhone 项目中使用 Google 地图 并且我正在使用 GMSPolygon 来绘制多边形 但是如何填充地图上除多边形内部之外的所有位置 就像下图一样 谢谢 我玩过你的问题 主要思想是用多边形填充整个地球 然后为您的特定
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 如何在 Apple Watch Extension/App 和 iOS App 之间建立通信通道

    我正在探索 WatchKit SDK 当我有 WatchKit 应用程序时 是否可以在 WatchKit 应用程序上从 iPhone 应用程序设置值 例如文本 设置 我可以从 iPhone 应用程序调用 WatchKit 应用程序扩展中的函
  • 玻璃效果 UIView

    我想知道如何在 UIView 上添加玻璃效果 我想像这样的效果 http pttrns com pickers detail 0dc9d9f6c6a7577613b3453768eee3b3在灰色半透明视图上 您 可以在这里看到 Thank
  • 如何检测Retina高清显示屏?

    UIScreen有一个新的 nativeScaleiOS 8 中的属性 但文档没有提及它 property nonatomic readonly CGFloat nativeScale 还有一个scale属性 但文档说它是 2 用于视网膜显
  • 使用 Cocoa 获取无法安装的驱动器列表

    我想获取在 OS X 下使用 Cocoa Objective C 无法安装 弹出的驱动器列表 我希望 NSWorkspace getFileSystemInfoForPath 能帮助我 NSArray listOfMedia NSWorks
  • PresentModalViewController 不执行任何操作

    我有一个 UIViewController parent 调用presentModalViewController与另一个 UIViewController child on viewDidLoad If parent没有 UINaviga
  • 使用 Google place API 从 lat long 获取附近的地点

    我正在使用 google place API 即 https maps googleapis com maps api place search json location 33 7167 73 0667 radius 500 type f
  • 我什么时候应该对 IBOutlet 使用弱或强限定符? [复制]

    这个问题在这里已经有答案了 可能的重复 ARC 下 IBOutlets 应该强还是弱 https stackoverflow com questions 7678469 should iboutlets be strong or weak
  • 如何更改已上传的 Firebase 存储图像文件名?

    我需要更改已上传到 firebase 存储中的文件名 因为 在 firebase 存储中上传图像后 我将 url 保存在 firebase 数据库中的特定子 文件夹 下 但是 当我将图像移动到另一个子 文件夹 时 我需要根据新名称更改存储中
  • 自定义 MKAnnotationView - 如何捕获触摸而不忽略标注?

    我有一个自定义 MKAnnotationView 子类 它完全按照我想要的方式显示视图 在那个视图中 我有一个按钮 我想捕获按钮上的事件来执行操作 这很好用 但是 我不希望标注被忽略或消失 基本上 触摸标注中的按钮将开始播放声音 但我想保留
  • 使用 Storyboard 时获取 NSManagedObjectContext

    目标是获取当前的 NSManagedObjectContext 以便使用 Core Data 在 iOS 4 3 中 我将 UINavigationController 的委托设置为 AppDelegate 如下所示 在 AppDelega
  • 按下表格视图单元格时更改视图?

    我需要帮助 当我的 tableView 的单元格被选择时 我希望该单元格转到它自己的页面 我不希望每个单元格都转到同一页面 我尝试使用 FirstFolderViewController first FirstFolderViewContr
  • 如何通过辅助功能 API 获取当前所选文本的全局屏幕坐标。

    我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD CTRL D 时显示所选文本的以下弹出对话框 我想实施 我的可可应用程序具有相同的功能 我的应用程序将在后台运行 并显示有关所选文本的一些热键的建议 我已经实现了热键捕获 我只需要
  • UINavigationController 在 UITabBarController 的 moreNavigationController 中不起作用

    我正在处理UINavigationControllers在我的应用程序中 全部由UITabBarController 一切工作正常 直到我的控制器落入自动生成的 更多 选项卡 我在简单的示例中重现了该问题 难道我做错了什么 我想不通 感谢您

随机推荐

  • Ruby on Rails 错误。处理控制器方法为 png

    我已经在我的路线中给出了这个 get custom page name gt custom page load content 这是我的控制器方法 def load content page name params name split j
  • Ionic 构建时阻止 HTTPS --release android apk

    调试 apk 工作正常 这排除了通常的嫌疑 但是当我构建 签名 安装发布版本时 角度无法进行 https http API 调用 http 到同一端点 我允许调试 可以工作 科尔多瓦白名单已安装ionic plugin add cordov
  • 如何将离线 HTML5 Web 数据库与集中数据库同步

    我希望能够在 HTML5 iPad Web 应用程序中执行以下操作 将数据上传到在线数据库 如果我用 SQLite 之类的东西构建在线数据库 大小可能 将数据的子集或完整副本提取到离线网络数据库 超出3G网络覆盖范围 对下载的数据执行一系列
  • 超链接 HREF 不起作用

    我正在考虑一个新的网站想法 但是当我测试它时 A HREF 不起作用 它甚至没有显示手指 手指针 它是内容区域的文本 标题下的第一个白色块 但不是菜单 标题应该是帖子的链接 Wordpress 无效链接的屏幕截图 红色箭头 http new
  • 为什么此方法会导致代码分析错误 CA2000: Call Dispose()

    我正在使用 Microsoft Minimal Rules 代码分析集构建我的项目 它为我提供了关于此方法的 CA2000 private Timer InitializeTimer double intervalInSeconds Tim
  • 在 Git 中引用提交的子级

    如果您想移动HEAD到当前的父级HEAD 这很容易 git reset hard HEAD 但是有没有简单的方法可以执行与此操作完全相反的操作 即将头设置为当前头的第一个子提交 现在 我使用 gitk 作为解决方法 alt tab 向上箭头
  • Activeadmin 和 Formtastic:表单不响应:size

    我正在尝试格式化表单 文本字段响应某些方法 而不响应其他方法 我可以做这样的事情 f input name input html gt maxlength gt 10 f input name input html gt disabled
  • 神秘的底部边框

    我答应改变一个电子商务网站上的标志 虽然需要几分钟 但它花了很多小时 所以我希望有更多 CSS 经验的人可以帮助我 这是网站 http varuosad ee http varuosad ee 我似乎无法做到 tr 包含与图像 155px
  • Perl 6 分别捕获重复匹配组?

    我相信 Perl 6 提供了单独捕获重复组的能力 而不是早期的风格 您只能捕获最后一个组或整个匹配的组字符串 有人可以举一个很好的例子来说明如何使用 Perl 6 的这个很棒的功能吗 例如 我需要捕获此正则表达式的所有匹配组 and say
  • XPath:如何选择与同一级别的其他元素相关的元素

    问题很简单 但我对这种情况没有足够的练习 如何获得price如果我们知道我们只需要 块 中每个 div 的文本值商品促销元素 div class block div class item promo item div div class i
  • Python 上的 OpenCV 中的立体校准

    我是 OpenCV 新手 找不到 Python 上的 StereoCalibration 的正常教程 如果您有一些示例 请分享 I do single calibration for each of cameras and i have n
  • 如何针对特定活动禁用 Android 软键盘?

    我有一个包含一个 EditText 的活动 我只需要输入数字 现在 我已将 EditText 的输入类型定义为仅数字 并绘制了一个漂亮的键盘供用户使用 但是我还需要确保用户单击时不会弹出软键盘编辑文本 我尝试通过添加来通过清单隐藏键盘 an
  • 使用打开的终端 Windows 目录路径在 OSX(Snow Leopard) 中打开新的终端选项卡

    我已经在谷歌上搜索了一段时间 寻找一种简单的方法来做到这一点 但我找不到 我设置了一个自定义终端环境 zsh 其中包含各种别名和函数 以使事情变得更容易 我不断遇到的一件事是 我将快速 APPLE t 创建一个新选项卡 然后键入相对于我刚刚
  • Android - 设置应用程序的默认“打开支持的链接”选项

    如何控制默认值Open supported links到任一Ask every time or Open in this app对于我的 Android 应用程序 它发生在清单中吗 我有两个应用程序尝试接受相同的通用链接方案 理想的行为是让
  • 套接字上的 ClamAV clamd INSTREAM 出现间歇性问题

    我有一个运行 NodeJS 代码的 AWS Lambda 函数 用于将文件从 S3 流式传输到在 EC2 实例上运行的 ClamAV 一般来说 大约 75 的时间 系统可以正常工作 但经常 特别是当从不同的 Lambda 容器扫描多个文件时
  • Scala:谁能解释一下?

    考虑以下 Scala 代码 case class Data T value Option T def get T try doGet catch case e Exception gt throw new IllegalArgumentEx
  • Kotlin 中的按钮数组

    如何在 Kotlin 的 android studio 中创建按钮数组 我已经在 xml 文件中创建了带有 id 的按钮 现在我想在 Kotlin 代码中使用与数组元素相同的按钮 我尝试过这样的事情 var buttons Array
  • 有人在 R 中实现 Eureqa 接口吗?

    好吧 这个问题并不完全是技术性的 但非常相关且当前 如果您可能还没有听说过 Eureqa http creativemachines cornell edu eureqa 是一种基于机器学习 的工具 可帮助您找到数据中隐藏的方程和数学关系
  • Hibernate中的“删除哪里”级联删除?

    我正在尝试通过其外键之一级联删除连接表中的行 并且它有另一个与其相关的表 我也想删除与此 ID 关联的所有行 所以看起来如下图所示 当我将 Session delete reqCandObject 与 hibernate 一起使用时 它工作
  • 持久化自定义对象

    我有一个简单地继承自 NSObject 的自定义对象 它有 3 个成员 两个花车和一个NSDate 我的应用程序将有一个数组 其中包含许多这些对象 并且我需要在运行之间保留它 我怎样才能做到这一点 我考虑过使用 SQLite 数据库 但我认