NSKeyedArchiver 和 NSKeyedUnarchiver 与 NSMutableArray

2024-01-04

我希望这与我在这里使用可变数组这一事实无关,但这让我感到困惑,所以如果是这种情况,我也不会感到惊讶。

背景:

我制作了一个小型数据库,它本质上是一个包含自定义对象的 NSMutableArray,我们可以将其称为 recordObjects。我设置了数组:

database = [[NSMutableArray alloc] init];

我的自定义对象(称为“recordObject”)包含以下变量和初始化:

NSString *name;
int       anInt;
Bool      aBool;

我还合成了方法,这样我就可以进行如下调用:

aString = [[database objectAtIndex:someIndex] name];

并向我的控制器类添加了方法来添加、删除和选择要显示的单个记录。到目前为止,一切正常且完全符合预期。

接下来,我设置了 recordObject 类(NSObject 的子类)以使用 NSCoder(通过包含在 @interface 指令中,并在实现文件中添加了以下自定义编码器和解码器方法:

-(void) encodeWithCoder: (NSCoder *) encoder {
    [encoder encodeObject: name  forKey: @"recordName"];
    [encoder encodeInt:    anInt forKey: @"recordInteger"];
    [encoder encodeBool:   aBool forKey: @"recordBool"];
}

-(id) initWithCoder: (NSCoder *) decoder {
    name    = [decoder decodeObjectForKey: @"recordName"];
    anInt   = [decoder decodeIntForKey:    @"recordInteger"];
    aBool   = [decoder decodeBoolForKey:   @"recordBool"];
}

为了写入文件,我使用了以下内容:

[NSKeyedArchiver archiveRootObject:database toFile:myPath];

当我运行该程序时,一切似乎都正常工作。为数组中的每条记录调用编码器方法,并将文件写入磁盘。使用 TextEdit 打开文件显示数据就在那里(尽管对我来说大多难以理解。)

问题:

这就是我遇到困难的地方。

我添加了以下代码以将文件加载到我的数据库数组中:

database = [NSKeyedUnarchiver unarchiveObjectWithFile:myPath];

当我再次运行该程序时,这次加载数据库,它似乎工作正常。我的第一个测试是使用 NSMutableArray 计数方法:

x = [database count];

结果是 X 填充了文件中正确数量的记录。如果我保存数据库时有5条记录,则在下次执行程序时加载数据库后X将设置为5。

现在,这是一个大问题:

如果我尝试使用任何访问器方法,程序就会崩溃。例如,如果我在加载数据库后尝试使用以下命令:

aString = [[database objectAtIndex:someIndex] name];

程序崩溃并在控制台中返回以下错误:

Program received signal:  “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all

我的解释是,由于某种原因,数据没有正确加载并初始化到数据库数组中,但我一生都无法弄清楚我在这里出了什么问题。

附带说明一下,我实现的所有内容都来自 Stephen G. Kochan 的书“Programming in Objective-C”

任何想法将不胜感激!


您的代码存在一些问题。

Your initWithCoder:方法没有完全实现。你必须打电话[super init]并返回self。你还必须copy or retain字符串对象,否则它将被自动释放:

- (id)initWithCoder:(NSCoder *)decoder 
{
    self = [super init];
    if(self)
    {
         name    = [[decoder decodeObjectForKey: @"recordName"] copy];
         anInt   = [decoder decodeIntForKey:    @"recordInteger"];
         aBool   = [decoder decodeBoolForKey:   @"recordBool"];
    }
    return self;
}

另一个问题是这一行:

database = [NSKeyedUnarchiver unarchiveObjectWithFile:myPath];

这很好,除了两件事:

  1. 您没有持有对该对象的引用,因此它将是 自动释放。
  2. NSKeyedArchiver返回一个不可变对象,在本例中是NSArray而不是一个NSMutableArray.

你需要这样做:

database = [[NSKeyedUnarchiver unarchiveObjectWithFile:myPath] mutableCopy];

这将保留该对象(因为它是一个副本)并使该对象成为NSMutableArray.

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

NSKeyedArchiver 和 NSKeyedUnarchiver 与 NSMutableArray 的相关文章

  • 如何用Block简化回调逻辑?

    假设我需要与一个提供协议的类进行通信 并在操作完成时调用委托方法 如下所示 protocol SomeObjectDelegate required void stuffDone id anObject void stuffFailed e
  • 如何将字符串从 Applescript 传递到 Objective C

    我正在开发一个应用程序 我需要能够传递一个字符串变量 from 苹果脚本 to 目标C 我已经弄清楚如何从 Objective C 类中的方法运行 Applescript 但我需要能够将 NSString 设置为 Applescript 中
  • 由于 2.23 导致 iOS 应用程序被拒绝 - iOS 数据存储指南

    以下是 Apple 关于拒绝的消息 2 23 应用程序必须遵循 iOS 数据存储指南 否则将被拒绝 2 23 详情 在启动和内容下载时 您的应用程序会存储 6 5 MB 这并不意味着 遵守 iOS 数据存储指南 下一步 请验证只有用户使用您
  • Objective C (iphone) 关于发布的问题

    如果我创建一个视图 并将其添加为子视图并将其添加到数组中 是否必须释放它两次 UIView cat UIView alloc initWithFrame someFrame self view addSubview cat self ani
  • AVPlayer 不播放音频 - iOS 9,目标 - C

    我正在尝试从我的应用程序中的 URL 播放音频 iOS 8 中一切都按预期发生 模拟器和物理设备 对于 iOS 9 它可以在模拟器中运行 但在设备上 音频根本无法播放 出现流媒体 如果我单击播放 进度条还显示音频正在加载并播放 但没有声音
  • 在回调函数中调用目标c函数

    如何在回调函数中调用目标c函数 回调函数 static OSStatus inputRenderCallback void inRefCon AudioUnitRenderActionFlags ioActionFlags const Au
  • 为具有多个目标和不同平台的项目编写 Podfile

    我正在准备一个支持 OS X 和 iOS 的 Pod 我的 pod 有一些自己的依赖项 这些依赖项在 podspec 文件中定义 因此我使用 Podfile 来管理我用来开发 pod 和运行测试的项目的依赖项 我正在使用 CocoaPods
  • 如何编辑应用程序包中的文件?

    在我的应用程序中 我从存储在捆绑资源中的 CSV 文件加载数据 但是 我希望能够在用户点击 更新 按钮时以编程方式更新此文件 有没有办法以编程方式更改应用程序包中的资源 这是我用来访问该文件的代码 NSString path NSBundl
  • 如何将CIFilter应用到UIView上?

    根据Apple docs 过滤属性CALayer不支持iOS 当我使用正在申请的应用程序之一时CIFilter to UIView即 Splice Funimate 和 Artisto 的视频编辑器 Videoshow FX 这意味着我们可
  • 检查 Objective-C 块类型?

    这主要是出于好奇 我不太确定它的实际用途是什么 但就这样吧 由于块也是 Objective C 对象 是否可以检查它们的类型 也就是说 它是否响应isKindOfClass 消息以及如何使用该消息来处理块 我天真的以为事情大概是这样的 vo
  • 如何将自定义 C 代码放入 SwiftPM 包中?

    我正在尝试将 C 代码打包到 Swift 模块中 我们称之为CModule 一旦我将其放入项目的基本文件夹中 Swift模块 并配置了搜索路径 我可以在 Swift 文件中自动完成工作 并检测错误 警告 问题是 导入时它无法识别该模块 并且
  • 如何去掉 UIWebView 上的状态栏背景?

    从 iOS 11 开始 当UIWebView全屏时 状态栏上会出现与屏幕颜色相同的假背景UIWebView背景 有人知道如何摆脱它吗 甚至添加IUWebView到故事板并使其全屏将使状态栏背景出现 我一直在尝试编辑 UIWebView 的大
  • 如何确定 NSTimeInterval 是否发生在任意 NSDate 期间?

    我有一个 NSTimeInterval 我想知道该时间戳是否位于日期的开始和结束之间 基本上我需要能够做类似的事情 NSDate today NSDate date NSTimeInterval myInterval someInterva
  • 如何重新定位或移动 Google Maps SDK 上的当前位置按钮?

    如何将 Objective C 中的当前位置按钮移至我的偏好 现在 我已启用它 但底角有东西挡住了它 Thanks 您可以使用 padding 将按钮向上移动 self mapView padding UIEdgeInsets top 0
  • 添加/删除带有动画的 UITableViewCell?

    我知道这听起来像是一个愚蠢的问题 但我到处都看过 我怎样才能做到这一点 我知道如何使用 swype to delete 方法来执行此操作 但是我如何在该函数之外执行此操作 请发布一些代码示例 Thanks Coulton self tabl
  • ARC 不允许将 Objective-C 指针隐式转换为“void *”

    这意味着什么 我有什么选择 ARC 不允许将 Objective C 指针隐式转换为 void 我正在将 Xcode3 项目移植到 iOS5 它使用 AudioSessionInitialize 如下 AudioSessionInitial
  • ios 在后台处理推送通知

    我想保存应用程序处于后台状态时到达的推送通知 我知道关于 void application UIApplication application didReceiveRemoteNotification NSDictionary userIn
  • NSCFData fastCharacterContents 崩溃? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我目前在控制台中收到此崩溃日志 20
  • 从 cocoa 编辑系统偏好设置

    有没有办法使用可可以编程方式编辑系统首选项 是否需要一些框架 我需要这样做来更改全局代理设置 另外 我的应用程序是沙盒的 有关于如何执行此操作的示例代码吗 感谢您的帮助 您正在寻找系统配置框架 但这并不容易 我认为沙盒应用程序不可能这样做
  • 获取 Mojave 上的鼠标坐标

    我有一个非常基本的小命令行应用程序 可以在下次单击鼠标时获取鼠标坐标 import

随机推荐

  • 如何更改移动布局上的 Bootstrap 3 列顺序?

    我正在制作一个带有顶部固定导航栏的响应式布局 下面有两列 一列用于侧边栏 3 一列用于内容 9 在桌面上看起来像这样 navbar 3 9 When I resize移动navbar被压缩并隐藏 然后侧边栏堆叠在内容之上 如下所示 navb
  • 在Android中将位图的大小减小到某个指定的像素

    我想将 我的位图 图像尺寸减小到最大 640 像素 例如 我有尺寸为 1200 x 1200 px 的位图图像 如何将其减小到 640px 如果你传递位图width and height然后使用 public Bitmap getResiz
  • 通过 git URL 从 lerna 管理的 monorepo 安装包

    我在我的项目中使用纱线 我的项目有一个依赖项 它恰好是 lerna 维护的较大 monorepo 的子包 子包已更新但尚未发布 我需要未发布的代码 有没有办法通过git url安装lerna的子包 Thanks 如果您的问题是 如何通过 g
  • 如何实现记住我功能? [复制]

    这个问题在这里已经有答案了 可能的重复 为网站实施 记住我 的最佳方式是什么 https stackoverflow com questions 244882 what is the best way to implement rememb
  • HttpResponseMessage 内容不会显示 PDF

    我创建了一个 Web Api 它返回一个 HttpResponseMessage 其中内容设置为 PDF 文件 如果我直接调用 Web Api 它会很好地工作 并且 PDF 会在浏览器中呈现 response Content new Str
  • Spark - 使用不同的数据类型以编程方式创建模式

    我有一个由 7 8 个字段组成的数据集 这些字段的类型为 String Int 和 Float 我尝试使用以下方法通过编程方法创建架构 val schema StructType header split map column gt Str
  • Zend框架2访问模型类中的全局配置

    我有一个模型类 它不扩展任何核心 Zend 模块 该模型是从我之前的 Zend Framework 1 应用程序导入的 我可以通过将其转换为命名空间来调用它的方法 我遇到的问题是在定义的方法中读取全局配置 对于控制器 我可以使用以下代码访问
  • R 中的 readHTMLTable 仅从篮球参考页面返回前两个表

    我正在尝试从篮球参考网站抓取球队统计网页 但当我使用 readHTML 时 它只会带回前两个表格 我的 R 代码如下所示 url http www basketball reference com leagues NBA 2015 html
  • 使用 GCD 同步 Swift 3 中的属性

    我看了今年的WWDCGCD最近谈话 我认为有一个代码片段有问题 这是关于使用以下方法使属性成为线程安全的调度队列 class MyObject private var internalState Int private let intern
  • 在 for 循环中声明匿名结构,clang 无法编译

    在 for 循环中声明匿名结构的代码在 gcc 中使用 std c99 gnu99 工作得很好 for struct int foo int bar i 0 i foo lt 10 i foo 但是 当我切换到 clang 时 我收到了错误
  • 使用 Hadoop/MapReduce 查找连接的组件

    我需要为一个巨大的数据集找到连接的组件 图是无向的 一个显而易见的选择是 MapReduce 但我是 MapReduce 的新手 我没有足够的时间来学习它并自己编写代码 我只是想知道是否有任何现有的 API 可以解决这个问题 因为这是社交网
  • Qt Creator 编译器配置问题

    我刚刚开始学习 C 并遇到了 Qt Creator 我已经将它与内置的 MinGW 编译器一起安装了 但是我无法让我的项目 构建并运行 我在下面附上了一些屏幕截图 谢谢您的帮助 最后一张图片显示了我可以选择的两个自动检测套件 我尝试创建自己
  • 如何在 Svelte 3 中拥有条件属性?

    有没有更简单的方法来编写以下复选框组件 if disabled
  • 给定一组有限的排序实数,生成总和 <= k 的所有可能子集

    我想知道是否存在解决这个问题的算法 它与背包 0 1 问题或幂集问题有点相似 但又有所不同 给定一组有限的排序实数 我们需要生成总和 解决问题的一种方法是简单地从最大数字 4 46 开始遍历 看看可以将多少个放入篮子中 然后继续向下一个最小
  • 使用多线程写入文件

    我正在尝试使用多个线程在 Java 中编写一个大文件 我都尝试过FileWriter and bufferedWriterJava 中的类 正在写入的内容实际上是使用读取的整个表 Postgres CopyManager并写下 文件中的每一
  • matplotlib 中的图例设置(numpoints 和 scatterpoints)不起作用

    我试图让图例适合虚线 所以我稍微使用了 rcParams 但由于某些原因它无法在我的计算机上工作 import numpy as np import matplotlib pyplot as plt import matplotlib ma
  • kCGColorSpaceGenericRGB 在 iPhone 上已弃用?

    我正在尝试使用以下代码获取位图上下文 GContextRef MyCreateBitmapContext int pixelsWide int pixelsHigh CGContextRef context NULL CGColorSpac
  • UILabel 根据要显示的文本自动调整大小

    我正在开发一个应用程序 其中需要根据要显示的文本自动调整文本区域的大小 首先 我不确定我是否应该使用UILabel 逻辑上是显示静态文本的最佳选择 就我而言 或UITextView 我希望如何使用它 我想简单地用文本初始化我的标签或文本视图
  • 如何在 django 中将列表从视图传递到模板

    我正在尝试将列表从 Django 中的视图传递到模板 在我的文件 wiew py 中 我定义了名为 hour 的视图 This Python file uses the following encoding utf 8 from djang
  • NSKeyedArchiver 和 NSKeyedUnarchiver 与 NSMutableArray

    我希望这与我在这里使用可变数组这一事实无关 但这让我感到困惑 所以如果是这种情况 我也不会感到惊讶 背景 我制作了一个小型数据库 它本质上是一个包含自定义对象的 NSMutableArray 我们可以将其称为 recordObjects 我