iPhone - 归档自定义对象数组

2024-01-31

我已经尝试了几个小时但无法解决这个问题。

我正在制作一个保存未完成的国际象棋游戏的应用程序,因此我尝试将数组写入文件。

如果有意义的话,这就是数组:

-NSMutableArray savedGames
--GameSave a
---NSMutableArray board;
----Piece a, b, c, etc.
-----some ints
---NSString whitePlayer, blackPlayer;
---int playerOnTop, turn;
--GameSave b
---NSMutableArray board;
----Piece a, b, c, etc.
-----some ints
---NSString whitePlayer, blackPlayer;
---int playerOnTop, turn;

etc.

这些是我的 NSCoding 方法:

游戏保存.m

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:whitePlayer forKey:@"whitePlayer"];
    [coder encodeObject:blackPlayer forKey:@"blackPlayer"];
    [coder encodeInt:playerOnTop forKey:@"playerOnTop"];
    [coder encodeInt:turn forKey:@"turn"];
    [coder encodeObject:board forKey:@"board"];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [[GameSave alloc] init];
    if (self != nil)
    {
        board = [coder decodeObjectForKey:@"board"];
        whitePlayer = [coder decodeObjectForKey:@"whitePlayer"];
        blackPlayer = [coder decodeObjectForKey:@"blackPlayer"];
        playerOnTop = [coder decodeIntForKey:@"playerOnTop"];
        turn = [coder decodeIntForKey:@"turn"];
    }   
    return self;
}

Piece.m

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeInt:color forKey:@"color"];
    [coder encodeInt:piece forKey:@"piece"];
    [coder encodeInt:row forKey:@"row"];
    [coder encodeInt:column forKey:@"column"];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [[Piece alloc] init];
    if (self != nil)
    {
        color = [coder decodeIntForKey:@"color"];
        piece = [coder decodeIntForKey:@"piece"];
        row = [coder decodeIntForKey:@"row"];
        column = [coder decodeIntForKey:@"column"];
    }   
    return self;
}

这是尝试存档并保存到文件的代码:

- (void)saveGame {
    ChessSaverAppDelegate *delegate = (ChessSaverAppDelegate *) [[UIApplication sharedApplication] delegate];
    [[delegate gameSave] setBoard:board];

    NSMutableArray *savedGames = [NSKeyedUnarchiver unarchiveObjectWithFile:[self dataFilePath]];
    if (savedGames == nil) {
        [NSKeyedArchiver archiveRootObject:[delegate gameSave] toFile:[self dataFilePath]];
    } else {
        [savedGames addObject:[delegate gameSave]];
        [NSKeyedArchiver archiveRootObject:savedGames toFile:[self dataFilePath]];
    }
}

- (NSString *)dataFilePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:@"gameSaves.plist"];
}

抱歉,问题是这样的:

设置一些断点后,在 -saveGame 的这一行之后出现错误:
[NSKeyedArchiver archiveRootObject:savedGames toFile:[self dataFilePath]];

这就是控制台中显示的内容:

2010-05-11 17:04:08.852 ChessSaver[62065:207] *** -[NSCFType encodeWithCoder:]: unrecognized selector sent to instance 0x3d3cd30
2010-05-11 17:04:08.891 ChessSaver[62065:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFType encodeWithCoder:]: unrecognized selector sent to instance 0x3d3cd30'
2010-05-11 17:04:08.908 ChessSaver[62065:207] Stack: (
    32339035,
    31077641,
    32720955,
    32290422,
    32143042,
    238843,
    25827,
    238843,
    564412,
    342037,
    238843,
    606848,
    17686,
    2733061,
    4646817,
    2733061,
    3140430,
    3149167,
    3144379,
    2837983,
    2746312,
    2773089,
    41684313,
    32123776,
    32119880,
    41678357,
    41678554,
    2777007,
    9884,
    9738
)

如果重要的话,-saveGame 会从导航控制器中的 UIBarButton 调用。

如有任何帮助,我们将不胜感激,谢谢。


这是错误的:

- (id)initWithCoder:(NSCoder *)coder {
    self = [[Piece alloc] init];
    if (self != nil)
    {

到......的时候initWithCoder:称为该类的实例已被分配。在您的代码中,您正在泄漏该实例。你应该这样做:

- (id)initWithCoder:(NSCoder *)coder {
    self = [super init]; // or [self init] if needed
    if (self != nil)
    {

另外,当你解码一个对象时,你并不拥有它,所以你需要保留它。

board = [[coder decodeObjectForKey:@"board"] retain];

如果您没有“掌握”保留/释放规则,请立即学习它们,否则您将不断搬起石头砸自己的脚。

另外,你的saveGame方法有几个问题。

  1. If savedGames为零,您正在将对象而不是数组保存到文件中。这意味着在下次运行时,未归档的对象将不会是您期望的数组。
  2. 未归档的数组是不可变的。将类型声明为NSMutableArray没关系,如果您归档一个可变数组,您将在取消归档时得到一个不可变数组。你需要打电话mutableCopy如果要修改未归档的阵列。

我不确定这个异常到底是什么,但是解决上述问题,要么它就会消失,要么解决方案将变得更容易找到。

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

iPhone - 归档自定义对象数组 的相关文章

  • ios7 绘图时出现延迟

    我有一个应用程序 在其中我正在视图上绘制一些草图 到目前为止 在我安装之前它运行良好ios7 我的应用程序使用触摸移动方法来识别运动的变化 但是当我画一条线时 触摸方法被调用 但线不会更新 直到我触摸结束ios7 所以画起来有一点点滞后 它
  • Coredata错误setObjectForKey:对象不能为nil

    我正在尝试检查我的核心数据存储中是否有任何数据作为我的应用程序的恢复类型 基本上 如果用户处于最终视图 则 coredata 中会有一些数据不断更新 因此 他们处于最终视图中 然后应用程序崩溃 或者他们将其置于睡眠状态 然后应用程序从内存中
  • iOS:如何在 UITabBarItem 中添加下划线

    我正在使用一个应用程序 我需要在其中添加下划线UITabbarItem 所以我想在所选下添加下划线UITabbarItem在默认情况下UITabbarcontroller of iOS 我已经创建了子类UITabbarcontroller但
  • iOS:启动图像多语言

    我有一个多语言应用程序 我的问题是启动图像 根据设备的语言使用启动图像的方法是什么 有什么东西在info plist file 解决方案是像项目中的任何其他资源一样本地化 Default png 从 Xcode 的项目列表中选择 Defau
  • AVMutableComposition - 导出错误的视频转换

    导出 VideoAsset 后 问题 视频方向是不是原始变换 导出视频层似乎总是景观 尝试去 变换视频层方向 旋转至原始方向 视频层大小 使其全屏尺寸 按原始方向 一些注意事项 videoAsset 的 CGRect 从一开始就是相反的 a
  • pdf文件文本阅读和搜索

    我想从 pdf 文件中读取文本并将文本搜索到 pdf 文件中 这是我知道的链接 这些都帮不了我 使用 Quartz 2D 解析 pdf 时获取文本位置 https stackoverflow com questions 3627745 ge
  • 使用 PRODUCT_NAME 构建 cocoapods 项目的 xcodebuild 失败

    我可以使用以下命令构建我的 Cocoapods 项目 base basename xcworkspace xcworkspace xcodebuild sdk iphonesimulator ios version CONFIGURATIO
  • 在 xcode 4 中找不到 info.plist

    所以常规介绍 我是 Objective C 的新手 到处搜索但找不到 所以请帮忙 我想做的就是将我的应用程序设置为在后台获取位置更新 就是这样 我知道我应该在项目的 info plist 文件中将位置添加到 UIBackgroundMode
  • 为什么不使用 Interface Builder [关闭]

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

    我正在开发一个针对移动设备的离线 Javascript 网站 iPhone 就是这样的一种移动设备 我正在尝试从 REST API JSON 对象的成员 解析日期 我在用着 Date parse 2010 03 15 10 30 00 这适
  • iPhone 存储大量图像

    我有大量与 sqlite 数据库中的记录相对应的图像 我应该把它们存放在哪里 我有同一张图像的 3 个版本 大号 中号 拇指号 我不想将它们存储在数据库表中 而是从每条记录中引用它们 所有图像都具有相同的名称 每个小 中和大图像文件都将被称
  • 如何在 iOS 中通过 3G 连接创建无线热点

    如果我愿意 我将如何创建一个像这样的应用程序MyWi http intelliborn com mywi html 即 WiFi 网络共享应用程序 实现该功能需要哪些步骤 我需要使用哪些框架 库 我们的目标不是尝试将此应用程序放入应用程序商
  • 将 iPhone 应用程序降级到以前的 SDK 安全吗?

    我发布了一个带有 2 2 1 SDK 的应用程序 意识到我毫无意义地失去了仍在使用固件 2 2 的大部分客户 请参阅这篇文章 http arstechnica com apple news 2009 03 app store lessons
  • 在基于视图的 NSTableView 中,如何通过单击使控件成为第一响应者?

    基于视图的 NSTableView 似乎只有标准行为 为了使表内的文本字段成为第一响应者 用户必须双击或单击并 保持冷静 然而 考虑到基于视图的 NSTableViews 提供的灵活性 这种行为并不总是可取的 因为现在可能有很多不同且复杂的
  • 这是 NSDateFormatter 风格 12 月 18 日星期五

    我想知道这个日期格式是什么Friday December 18th这也是标准的日期格式 或者我必须付出一些努力才能得到这个 Thanks 我不认为th可以通过格式化程序来实现 虽然你可以这样做 NSDate today NSDate dat
  • 在 xCode 6 中发现意外的 Mach-O 标头代码:1918975009

    导致错误的原因是什么 Found an unexpected Mach O header code 1918975009 in xCode 6 我将我的项目存档并作为ad hoc构建并且它构建 链接 存档很好但是当我在xCode组织者和选择
  • UIWebView stringByEvaluatingJavaScriptFromString 在后台

    在 iOS 应用程序中 我正在运行一个相当大的脚本UIWebView using stringByEvaluatingJavaScriptFromString 就 JavaScript 字符串的长度而言较大 调用 JavaScript 后会
  • 动态框架中未定义的架构符号

    我正在开发一个 iOS 框架 该框架包含多个第三方框架并使用 UnitySendMessage C 方法与 Unity 进行通信 我想创建一个动态框架 支持 iOS8 但我偶然发现以下编译错误 Undefined symbols for a
  • 使用 MKPolyline 在地图上绘制用户路线

    我对 Objective c 还很陌生 在我的应用程序中 我试图将用户采取的路线绘制到地图上 到目前为止 这是我仅获取用户当前位置的内容 import StartCycleViewController h import CrumbPath
  • iOS7 无法隐藏状态栏

    我刚刚将我的 iPhone 5 iOS 7 升级到了四个测试版 现在 当我在这台 iPhone 上通过 Xcode 5 运行我的应用程序时 状态栏不会隐藏 尽管它应该隐藏 不工作 UIApplication sharedApplicatio

随机推荐