- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我希望这与我在这里使用可变数组这一事实无关,但这让我感到困惑,所以如果是这样的话我也不会感到惊讶。
背景:
我制作了一个小型数据库,它本质上是一个包含自定义对象的 NSMutableArray,我们可以将其称为 recordObjects。我设置了数组:
database = [[NSMutableArray alloc] init];
我的自定义对象,称为“recordObject”,包含以下变量和初始化:
NSString *name;
int anInt;
Bool aBool;
我还合成了方法,这样我就可以像这样调用:
aString = [[database objectAtIndex:someIndex] name];
并向我的 Controller 类添加了方法来添加、删除和选择要显示的单个记录。到目前为止,一切正常,完全符合预期。
接下来,我设置了我的 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”
任何想法将不胜感激!
最佳答案
您的代码存在一些问题。
您的initWithCoder:
方法没有完全实现。您必须调用 [super init]
并返回 self
。您还必须复制
或保留
字符串对象,否则它将被自动释放:
- (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];
这很好,除了两件事:
NSKeyedArchiver
返回一个不可变对象(immutable对象),在本例中是一个 NSArray
而不是 NSMutableArray
。你需要这样做:
database = [[NSKeyedUnarchiver unarchiveObjectWithFile:myPath] mutableCopy];
这将保留对象(因为它是一个副本)并使对象成为 NSMutableArray
。
关于objective-c - NSKeyedArchiver 和 NSKeyedUnarchiver 与 NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10391803/
在 iOS 12 中,NSKeyedArchiver 的初始化程序 init(forWritingWith:) 已被弃用。 Xcode 10 建议用新的初始化程序 init(requiringSecu
您好,我需要将 NSKeyedArchiver 类加载到 C++/CLI 对应项。有没有办法获取 NSKeyedArchiver 的内部格式? 另一种选择是将整个保存和打开代码重写为适用于 Mac 和
我有一个有时会更改的对象列表,并且我希望每当应用程序关闭或移动到后台时都在设备上保留持久缓存。列表中的大多数对象都不会改变,所以我想知道保存列表的最佳方法是什么。我考虑了两个主要选择: 使用 NSKe
所以我实现了这两个函数来在我的应用程序中保存数据: - (NSString*)itemArchivePath { NSArray* documentDirectories = NSSearchP
根据我的理解,完整的对象图是使用以下方式存储的: NSKeyedArchiver archiveRootObject 并且按照保存的顺序检索它,这是正确的吗? 我正在获取一个 NSDictionary
@界面 @interface Patient : NSObject @实现 - (id)initWithCoder:(NSCoder *)decoder{ self.patientPhoto
所以我有一个包含一些自定义类的数组: 带游戏的 NSMutableArray (FirstViewcontroller)- 骰子游戏 (Game.m)-- 带选项的骰子 (Dices.m) 在每个自定
我似乎无法让 NSKeyedArchiver 工作。我有一个主 ViewController,它有一个 NSMutableArray 作为实例变量。该数组由自定义类的多个实例填充。自定义类符合NSCo
因此,我的应用程序查询 Amazon Dynamo DB 数据库并检索几千字节的数据。我希望应用程序做的是第一次下载所有内容,然后每次都下载时间戳以查看它是否具有最新版本的数据。所以我只需要每隔一段时
我正在使用 Objective-C 构建一个应用程序,我想保留数据。我在 NSKeyedArchiver 和核心数据之间犹豫不决。我知道网上有很多关于此的资源(包括 Objective-C best
我在使用 NSKeyedArchiver 时遇到问题。我正在尝试归档一个字典,它又包含自定义对象、专辑和歌曲的数组。 Album 和 Song 都是 NSObject 固有的,并且符合 NSCodin
我的应用使用自定义类作为其数据模型: class Drug: NSObject, NSCoding { // Properties, methods etc... } 我刚刚创建了一个 Tod
我目前正在调查一个据称通过 NSKeyedArchiver 存储的文件解档期间发生的崩溃。崩溃日志包含文件的前 8 个字节四部分(下面我只包括前 2 个)。 Fatal Exception: NSIn
我正在用下面的做IOS App数据备份 NSKeyedArchiver.archiveRootObject() NSKeyedUnarchiver.unarchiveObjectWithFile()
我在使用 NSKeyedArchiver.archivedData 时遇到 unrecognized selector sent to instance 错误。 我试图将解析的 JSON 输出存储到自
我正在尝试使用 NSKeyedArchiver 来“归档”一个简单的字典。键是 String 类型,值是 enum。 以下示例说明了我正在尝试做的事情: import Foundation enum
我是否需要担心在后台线程中使用 archiveRootObject 和 unarchiveObjectWithFile? dispatch_async(dispatch_get_global_queu
注意:Xcode 8 Beta 6 我不确定我遗漏了什么,但出于某种原因,我在 NSKeyedArchiver.archivedData 行上收到以下错误。 'NSInvalidArgumentExc
我有一个希望保存和加载的自定义类。该类包含一个 NSDate、一个 NSString 和一个 NSNumber。我已经在 .h 文件中实现了 NSCoding 协议(protocol)。这是我到目前为
我正在编写一个使用 NSKeyedArchiver 来保存其数据的应用程序。我的文件应该是 ishotTrack.plist 还是 ishotTrack.arch? 最佳答案 使用 NSKeyedAr
我是一名优秀的程序员,十分优秀!