- 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/
我有一组自定义对象,我正在将它们转换为 NSMutableDictionary,然后从中创建一个数组(这部分目前按预期工作)。 然后我尝试使用 NSKeyedArchiver 将该数据数组保存为文件。
过去几个小时我一直在努力解决这个问题,但我已经没有想法了。 我想做的只是存档一个对象,但是方法 archiveRootObject 一直返回 NO 这是我的代码: NSArray *paths = N
我有一个非常简单的问题,我只是找不到合适的答案。那是 [NSKeyedArchiver archiveRootObject:value toFile:filePath]; 根据苹果文档 here ,上
我在下面有两个模型 swift 文件。 // Item.swift import UIKit class Item: NSObject, NSCoding { var name: String
我正在制作一个 iPhone 应用程序并在 previous question 中我被告知我需要 archiverootobject 和 unarchiverootobject 的有效文件路径,但我不
我是 Objective C 的新手,正在编写一些简单的程序来熟悉自己。 尝试使用 NSKeyedArchiver 保存/读取信息,但每次我这样做都无法创建 .plist 文件。我环顾四周,一直找不到
我目前正在 Xcode 7 和 ios 9 上使用 SpriteKit,我遇到了建议的 URLByAppendingPathComponent 方法,该方法用于访问文件的本地 url 并结合 arch
是否真的可以调用 NSKeyedArchiver archiveRootObject 并使用数据保护 API 将文件属性设置为 NSFileProtectionComplete 或 NSFilePro
最近,我正在学习 NSKeyedArchiver 和 NSKeyedUnarchiver。我发现存在三种归档数组的方法,我正在尝试找出它们之间的区别。 1.使用archiveRootObject:to
NSKeyedArchiver.archiveRootObject(, toFile: ) 仅第一次返回true。每次我下次调用它时,该方法都会返回 false。 我读了一些SO,一些帖子说我不能用这
我有一个自定义的 Swift 类,它使用 NSKeyedArchiver 将数据写入文件系统。此类中完成这项工作的功能之一是: func writeDataToArchive (data: AnyOb
使用 iOS 12,archiveRootObject:toFile:已被弃用。谁能建议一种简化的替代方法来将对象归档到文件中? //Generic example of archiver prior
我是一名优秀的程序员,十分优秀!