请告知以下两个问题。
我使用下面的命令来读取文件的内容。但是即使数据存在于文件中,一些数据仍为零。请告知如何取消归档plist文件。
Dealer *dealer=[[NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/Documents/dealer.plist"] retain];
对于这一行:
@property NSDecimalNumber *miles
我写的就像
self.miles = [coder decodeObjectForKey:@"miles"]
initWithCoder
方法中的
和
[aCoder encodeObject:_miles forKey:@"miles"]
encodeWithCoder
方法中的。
但数据未保存在plist文件中。请指教。
答案 0 :(得分:0)
有几点意见:
您不应该使用这样的硬编码路径。您应该在应用程序的文档,缓存或临时文件夹中使用路径。
您是否检查了archiveRootObject
的返回代码?它成功了吗?
但encodeObject:forKey:
和decodeObjectForKey:
来电并没有错。以下代码对我来说很好。如果问题不是路径,那么问题就在其他地方。如果您仍然遇到问题,请修改您的问题以包含您描述的the smallest-possible, yet complete and stand-alone example that reproduces the problem(MCVE)。
@interface MyObject: NSObject <NSCoding>
@property (nonatomic, retain) NSDecimalNumber *miles; // use `strong` if using ARC
@end
@implementation MyObject
- (instancetype)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
self.miles = [coder decodeObjectForKey:@"miles"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:_miles forKey:@"miles"];
}
- (NSString *)description {
return [NSString stringWithFormat:@"<MyObject %p; miles=%@>", self, self.miles];
}
// if ARC, remove this `dealloc` method
- (void)dealloc {
[_miles release];
[super dealloc];
}
@end
和
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *fileURL = [[[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:false error:nil] URLByAppendingPathComponent:@"test.plist"];
MyObject *object = [[MyObject alloc] init];
object.miles = [NSDecimalNumber decimalNumberWithMantissa:42 exponent:0 isNegative:false];
BOOL success = [NSKeyedArchiver archiveRootObject:object toFile:fileURL.path];
NSLog(@"%@", success ? @"success" : @"failure");
MyObject *object2 = [NSKeyedUnarchiver unarchiveObjectWithFile:fileURL.path];
NSLog(@"%@", object2);
[object release]; // not needed if using ARC
}
@end