Ein paar Beobachtungen:
Sie nicht einen harten codierten Pfad so dass verwenden soll. Sie sollten einen Pfad innerhalb des Dokumenten-, Cache- oder Temp-Ordners der App verwenden.
Haben Sie den Rückgabecode von archiveRootObject
überprüft? War es erfolgreich?
Aber es gibt nichts falsch mit den encodeObject:forKey:
und decodeObjectForKey:
Anrufe. Der folgende Code funktionierte gut für mich. Wenn das Problem nicht der Pfad ist, liegt das Problem an anderer Stelle. Wenn Sie weiterhin ein Problem haben, bearbeiten Sie Ihre Frage so, dass sie the smallest-possible, yet complete and stand-alone example that reproduces the problem (ein MCVE) enthält, den Sie beschreiben.
@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
Und
@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
Als beiseite, das Fehlen der 'retain' Qualifikation für die Deklaration Ihres' NSDecimalNumber' ist besorgniserregend. Sie sollten wirklich einen geeigneten Qualifier hinzufügen, damit die synthetisierten Accessor-Methoden die richtige Speicherverwaltung für Sie vornehmen. Wenn Sie eine statische Analyse durchführen ("Analysieren" im Xcode-Menü "Produkt"), werden Sie vor diesen Problemen gewarnt. Oder besser, verwenden Sie ARC, was Ihr Leben viel einfacher macht. – Rob