虽然数据存在于文件

时间:2016-10-23 06:08:20

标签: ios objective-c

请告知以下两个问题。

  1. 我使用下面的命令来读取文件的内容。但是即使数据存在于文件中,一些数据仍为零。请告知如何取消归档plist文件。

    Dealer *dealer=[[NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/Documents/dealer.plist"] retain];
    
  2. 对于这一行:

    @property NSDecimalNumber *miles
    

    我写的就像

    self.miles = [coder decodeObjectForKey:@"miles"]
    
    initWithCoder方法

    中的

    [aCoder encodeObject:_miles forKey:@"miles"]
    
    encodeWithCoder方法中的

  3. 但数据未保存在plist文件中。请指教。

1 个答案:

答案 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