- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 Objective C 的新手,正在编写一些简单的程序来熟悉自己。
尝试使用 NSKeyedArchiver 保存/读取信息,但每次我这样做都无法创建 .plist 文件。我环顾四周,一直找不到答案。谁能帮我理解为什么“出了点问题……”总是最终输出?
谢谢!
// main.m
#import <Foundation/Foundation.h>
#import "Domicile.h"
void CreateAndArchive(NSMutableArray* objs, NSURL *saveLocation)
{
NSLog(@"Creating DOMICILE objects...");
Domicile *now = [[Domicile alloc] init];
Domicile *then = [[Domicile alloc] init];
now.HouseName = @"place1;
now.Address = @"506 99th street";
now.Residents = [[NSMutableArray alloc] initWithObjects: @"Erik", @"Jeremiah", @"Alex", @"Ryan", @"Kyle", @"Connor", nil];
now.City = @"aCity";
now.State = @"CA";
now.Zip = @"12345";
then.HouseName = @"place2";
then.Address = @"1011 E Fairmont street";
then.Residents = [[NSMutableArray alloc] initWithObjects: @"Erik", @"Asa", @"Ryan", @"Gabe", @"Josh", nil];
then.City = @"anotherCity";
then.State = @"VA";
then.Zip = @"54321";
NSMutableArray *saveThis = [[NSMutableArray alloc] initWithObjects: now, then, nil];
NSLog(@"saving to %@", [saveLocation absoluteString]);
if ([NSKeyedArchiver archiveRootObject:saveThis toFile:[saveLocation absoluteString]])
{
NSLog(@"SAVED!");
}
else{
NSLog(@"Something went wrong...");
}
}
NSMutableArray* Load(NSURL *location){
NSLog(@"Loading data from %@", [location absoluteString]);
return [NSKeyedUnarchiver unarchiveObjectWithFile: [location absoluteString]];
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSURL *dir = [[NSFileManager defaultManager] URLForDirectory:NSDesktopDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
NSURL *file = [dir URLByAppendingPathComponent:@"data.plist"];
NSMutableArray *domiciles = [[NSMutableArray alloc] init];
if ([[NSFileManager defaultManager] fileExistsAtPath:[file absoluteString]])
{
domiciles = Load(file);
NSLog(@"data loaded!");
NSLog(@"displaying for your convenience:");
for (Domicile *dom in domiciles) {
NSLog(@"\n\n%@", dom);
}
}
else
{
CreateAndArchive(domiciles, file);
}
}
return 0;
}
// Domicile.m
#import "Domicile.h"
@implementation Domicile
-(instancetype)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
_HouseName = [coder decodeObjectForKey:@"name"];
_Residents = [coder decodeObjectForKey:@"residents"];
_Address = [coder decodeObjectForKey:@"address"];
_City = [coder decodeObjectForKey:@"city"];
_State = [coder decodeObjectForKey:@"state"];
_Zip = [coder decodeObjectForKey:@"zip"];
}
return self;
}
-(void) encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.HouseName forKey:@"name"];
[aCoder encodeObject:self.Residents forKey:@"residents"];
[aCoder encodeObject:self.Address forKey:@"address"];
[aCoder encodeObject:self.City forKey:@"city"];
[aCoder encodeObject:self.State forKey:@"state"];
[aCoder encodeObject:self.Zip forKey:@"zip"];
}
-(NSString *) description{
NSString *desc = [[NSString alloc] initWithFormat: @"House : %@\n%@\n%@, %@\n%@\n", self.HouseName, self.Address, self.City, self.State, self.Zip];
return desc;
}
@end
最佳答案
当你想转换文件 NSURL
用于需要路径的方法时,你应该使用 path
方法,而不是 absoluteString
方法。正如 path
方法文档所说:
If the URL object contains a file or file reference URL (as determined with
isFileURL
), the return value of this method [path
] is suitable for input into methods ofNSFileManager
orNSPathUtilities
. If the path has a trailing slash, it is stripped.
absoluteString
方法返回一个看起来像 file:///Users/...
的字符串,但您不需要那个 file://
这些方法中的方案前缀正在寻找某些资源的路径。 path
方法返回您的文件路径,不受 file://
前缀的影响。
关于objective-c - NSKeyedArchiver archiveRootObject 总是返回 NO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25300268/
在 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
我是一名优秀的程序员,十分优秀!