使用 NSCoder 保存自己的类

2023-12-03

我正在尝试将一些自定义类/数据存储到我的 iPhone/iPad 应用程序中的文件中。

我有一个 RSHighscoreList 类

@interface RSHighscoreList : NSObject {
    NSMutableArray *list;
}

其中包含列表中 RSHighscore 的对象

@interface RSHighscore : NSObject {
    NSString *playerName;
    NSInteger points;
}

当我尝试将所有内容存储到文件时

- (void)writeDataStore {
    RSDataStore *tmpStore = [[RSDataStore alloc] init];
    _tmpStore.highscorelist = self.highscorelist.list;
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

    [archiver encodeObject:tmpStore forKey:kDataKey];
    [archiver finishEncoding];
    [data writeToFile:[self dataFilePath] atomically:YES];

    [archiver release];
    [data release];
}

@interface RSDataStore : NSObject <NSCoding, NSCopying> {
    NSMutableArray *highscorelist; 
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:highscorelist forKey:@"Highscorelist"];
}

该应用程序将崩溃并显示错误消息


-[RSHighscore encodeWithCoder:]: unrecognized selector sent to instance 0x573cc20
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[RSHighscore encodeWithCoder:]: unrecognized selector sent to instance 0x573cc20'  

我想知道为什么错误会告诉 RSHighscore,即使它是“包装的”。有人有好主意吗?


RSDataStore has an -encodeWithCoder:方法,但是(根据错误信息)RSHighscore没有。您需要实施NSCoding您正在序列化的每个类的协议。

@implementation RSHighscore
static NSString *const kPlayerName = @"PlayerName";
static NSString *const kPoints = @"Points";

-(id)initWithCoder:(NSCoder *)decoder {
    if ((self=[super init])) {
        playerName = [[decoder decodeObjectForKey:kPlayerName] retain];
        points = [decoder decodeIntegerForKey:kPoints];
    }
    return self;
}
-(void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:playerName forKey:kPlayerName];
    [encoder encodeInt:points forKey:kPoints];
}
...

如果基类为RSHighscore曾经改变过NSObject, the -initWithCoder:方法可能需要更改为调用[super initWithCoder:decoder]而不是[super init]。或者,添加<NSCoding>到 NSObject 并更改RSHighscore's -initWithCoder: now.

@interface NSObject (NSCoding)
-(id)initWithCoder:(NSCoder*)decoder;
-(void)encodeWithCoder:(NSCoder*)encoder;
@end

@implementation NSObject (NSCoding)
-(id)initWithCoder:(NSCoder*)decoder {
    return [self init];
}
-(void)encodeWithCoder:(NSCoder*)encoder {}
@end

@implementation RSHighscore
-(id)initWithCoder:(NSCoder *)decoder {
    if ((self=[super initWithCoder:decoder])) {
        playerName = [[decoder decodeObjectForKey:kPlayerName] retain];
        points = [decoder decodeIntegerForKey:kPoints];
    }
    return self;
}
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NSCoder 保存自己的类 的相关文章

  • 为什么 Xcode 4 不会对我未完整实现 UITableViewDataSource 协议发出警告?

    如果我在 Xcode 中使用以下代码声明并不完全实现我自己的协议 一些协议 h protocol SomeProtocol
  • MPMusicPlayerController 和 setNowPlayingItem

    我在用着MPMusicPlayerController 特别是与setNowPlayingItem协议 它是为了cydia 但我在制作时遇到了一些问题和理论的警告 似乎某些协议和方法不起作用 我收到如下警告 Tweak xm 177 war
  • iOS中的performSelector有什么用

    的作用是什么执行选择器 比较 self btnClicked and self performSelector selector btnClicked void btnClicked NSLog Method Called 两者都对我来说工
  • 适用于 Objective-C / iPhone 的良好 HTTP 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 UPDATE 这个问题显然已经过时了 参见日期 我建议只使用现代 iOS7 功能 例如 NSURLSession 我想 这个问题是为了历史
  • 使用 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
  • 对使用phonegap和钛的质疑[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近我听说了 PhoneGap 和 Titanium 移动网络应用程序的开发 我分析了这两个 Web 应用程序 并了解了如何使用它们以
  • 自定义 MKAnnotationView - 如何捕获触摸而不忽略标注?

    我有一个自定义 MKAnnotationView 子类 它完全按照我想要的方式显示视图 在那个视图中 我有一个按钮 我想捕获按钮上的事件来执行操作 这很好用 但是 我不希望标注被忽略或消失 基本上 触摸标注中的按钮将开始播放声音 但我想保留
  • 应用程序未通过协同设计验证?

    我在提交 iPhone 申请时遇到问题 我看到了一些类似的问题 但没有找到答案 当我存档项目并单击 验证 时 收到错误消息 应用程序未通过协同设计验证 签名无效 或者未使用 Apple 提交证书进行签名 我假设我在协同设计部分做错了什么 我
  • Obj-C / Swift 项目中的致命陷阱异常

    我开始将 Swift 代码集成到我的 Obj C 项目中 一切都进展顺利 但今天 当我更新到 Xcode 6 1 时 事情变得很糟糕 我从之前运行良好的 Swift 代码中收到了许多 陷阱 异常 第一次崩溃位于我的 UIFont 扩展中 这
  • 如何从通讯录 ios 以编程方式编辑电话号码值

    我正在尝试在 iOS 中以编程方式替换特定联系人的特定电话号码 获取联系人表单地址簿 我不知道为什么我无法保存新的电话号码并刷新地址簿以显示更改 我正在这样做 BOOL changeContactPhoneNumber NSString p
  • 如何将设备令牌和应用程序版本发送到服务器

    我已经实现将设备令牌和应用程序版本发送到 serverm 它在模拟器 硬编码数据 中工作正常 但在设备中无法工作 任何形式的帮助将不胜感激 先感谢您 这是代码 void application UIApplication applicati
  • iPhone UI 带有 Tableview 或 Scrollview? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • iphone opencv - 模板匹配

    我已经在我的 iphone 项目中实现了这个 OpenCV 构建 http aptogo co uk 2011 09 opencv framework for ios http aptogo co uk 2011 09 opencv fra
  • 删除 UINavigationBar 下的 1px 边框 - 不起作用

    IBOutlet var navBar UINavigationBar self navBar setBackgroundImage UIImage forBarMetrics UIBarMetrics Default self navBa
  • ios 如何存储用户输入的详细信息并取回?

    How to Store用户输入的详细信息和Get it Back在ios中 我有以下关注TextFields UserName Email Re enter Email id Phone State Address Localityand
  • 如何在 xcode 中使用相同的 nib 文件创建多个窗口

    我有一个使用表格视图作为界面的 iPhone 应用程序 每次用户点击其中一个表格单元格时 我想向用户显示另一个窗口 然而 我推入导航控制器的窗口的用户界面非常相似 因此 我决定制作一个 通用 nib 文件 以便在该通用 nib 文件的文件所
  • Keras:如何保存模型或权重?

    如果这个问题看起来很简单 我很抱歉 但是阅读 Keras 保存和恢复帮助页面 https www tensorflow org beta tutorials keras save and restore models https www t
  • Apple 允许后台任务运行多长时间?

    我必须将一系列图像文件上传到数据库 因此 我偶然发现苹果后台执行指南 https developer apple com library ios documentation iPhone Conceptual iPhoneOSProgram
  • 如何使用libxml解析来解析xml数据

    这是一个我想使用libxml解析来解析的xml结构 我如何获取 campaign 标签的属性值 即ID对于 图像 标签 即url and size 如果我使用这些值 我可以提取 code 标签和 name 标签的值 static const
  • 如何连续关闭 2 个模态视图控制器?

    我有 2 个以模态方式呈现的视图控制器 A presents B which presents C 当我解雇C时 我也想解雇B 但我不知道该怎么做 解雇C self dismissModalViewControllerAnimated YE

随机推荐

  • 如何写入资源文件?

    如果可以从源文件中读取 如下所示 string fileContent Resources Users using var reader new StringReader fileContent string line while line
  • 2 个扭曲的 SSL 证书

    我有这个代码 from twisted web server import Site from twisted web static import Data from twisted internet import reactor ssl
  • 在 R 中的变量列表上按组运行线性模型

    我有一个数据框 我需要为每个组 站点 运行 6 个 2 变量线性模型 然后 我需要将结果转换为数据框 线性模型中的第二个变量发生变化 我已经使用了该部分lapply 但我不知道如何按组运行 我已经在 SO 上找到了答案 可以回答我的部分问题
  • Tkinter 透明度遇到问题

    我在 TKinter 中使顶级小部件淡入时遇到问题 由于某种原因 小部件根本不会淡入 然后它将显示在任务栏中 但只有在单击运行此命令的按钮两次之后 它不应该出现在任务栏中 代码负责这些问题 Alpha 0 0 w1 attributes a
  • 每个序列化程序都支持 OnDeserializedAttribute 吗?

    我只是偶然发现MSDN 上的 OnDeserializedAttribute 描述指出 当应用于方法时 指定在对象图中的对象反序列化后立即调用该方法 相对于图中其他对象的反序列化顺序是不确定的 问题 是否需要具有此属性的方法any序列化器
  • 将额外参数传递给 usort 回调[重复]

    这个问题在这里已经有答案了 我有以下功能 WordPress 可以运行 但这实际上是一个 PHP 问题 他们对我的 term对象根据artist lastname每个对象的元数据中的属性 我想将一个字符串传递到 meta在第一个函数中 这将
  • Twig - 动态数组键

    目前正在开发一个基于 Symfony 的工具 我正在迭代一系列配置设置 我想要实现的目标似乎很简单 我正在努力获得一定的价值 但其中一个键必须是动态的 下面是一个没有动态密钥的工作示例 set id tmod config content
  • 什么是“访问器功能”?

    In 第 4 3 26 节标准 ECMA 262 版本的 根据属性的形式 可以表示值 直接作为数据值 原始值 对象或 函数对象 或间接通过一对访问器函数 我不明白 访问器函数 是什么意思 也没有在规范中找到访问器函数的定义 然后我在网上搜索
  • 如何在 Python 中使用 Selenium 编辑 CodeMirror?

    每次尝试将文本插入网页上的 CodeMirror 时 我都会收到以下错误消息 有谁知道如何使用selenium成功编辑codemirror WebDriverException Message unknown error Cannot re
  • OpenMP:深度优先搜索的好策略

    我正在编写一个 C 程序 该程序对封闭的骑士之旅 代码是here 我想使用 OpenMP 并行化它 我的问题是以一种创建足够程度的并行性的方式来做到这一点 现在相关部分我的代码看起来像这样 pragma omp parallel for r
  • Emacs:符号作为变量的值为空

    这是我的 emacs file setq default c basic offset 4 c default style linux setq default tab width 4 indent tabs mode t define k
  • 如何确定何时收到蓝牙文件?

    在我的应用程序中 我需要在收到蓝牙传输的文件后对其进行编辑 为了查明何时通过蓝牙接收到文件 我必须使用 BroadcastReceiver 监听什么 Intent 另外 请告诉我是否还有其他解决方案 如果用户通过 Android 操作系统获
  • 每个方面图的 Binwidth 不同

    试图理解分配唯一的binwidth对于每个因子水平geom histogram 但到目前为止还是失败了 这是可重现的数据 a lt rnorm 10 7 0 1 b lt rnorm 10 13 5 df lt data frame dat
  • 当我尝试在内核中使用 printf() 时出现错误

    我使用的是 Visual Studio 2010 和具有计算能力 2 0 的 GTX480 我尝试将 sm 设置为 2 0 但是当我尝试在内核中使用 printf 时 我得到 错误 从 device global 调用主机函数 printf
  • ACR122U NFC读写器频繁断线

    当我将 SIII Android 4 3 放在 ACR122U NFC 读卡器上时 LED 持续闪烁绿色 当我将 Samsung S4 Android 4 3 放入读卡器时 LED 会变绿直到手机位于读卡器上 在这两种情况下 NFC 均已打
  • Python OOP 和列表

    我是 Python 新手 它是 OOP 的东西 无法让它工作 这是我的代码 class Tree root None data def init self equation self root equation def appendLeft
  • 设置触发器以在每月的最后一个小时运行函数

    在谷歌脚本中 我知道有按日期运行的触发器 但我认为这不会起作用 因为每月的天数不同 所以我想知道是否有办法设置触发器在每月最后一个晚上 11 点运行 无论是 30 还是 31 Thanks 首先从项目创建一个触发器编辑 gt 当前项目的触发
  • 是否可以从管道步骤动态设置 Jenkins 作业参数?

    我有以下 简化的 Jenkins 管道代码 jobParams groovy List get Object paramVars def params params choice choices branch tag name RELEAS
  • WCFTestClient HTTP 请求未经客户端身份验证方案“匿名”的授权

    我创建了一项 WCF 服务并将其部署在服务器上 当我浏览此服务时 它会通过 wsdl URL 给出积极响应 现在我正在尝试通过 WCF 测试客户端测试该服务 它显示了正确的元数据 但是 当我尝试从服务中调用任何方法时 它会显示一个异常 这是
  • 使用 NSCoder 保存自己的类

    我正在尝试将一些自定义类 数据存储到我的 iPhone iPad 应用程序中的文件中 我有一个 RSHighscoreList 类 interface RSHighscoreList NSObject NSMutableArray list