2016-10-23 2 views
0

Bitte beraten Sie für die beiden folgenden Probleme.NSKeyedUnarchiver lesen Sie für einige der Attribute NULL, obwohl Daten in der Datei vorhanden sind

  1. ich den folgenden Befehl bin mit dem Inhalt eines file.But einige der Daten zu lesen, da kommen gleich Null, obwohl die Daten in der file.Please vorliegen beraten, wie die plist-Datei aus dem Archiv entfernen.

    Dealer *dealer=[[NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/Documents/dealer.plist"] retain]; 
    
  2. Für die Zeile:

    @property NSDecimalNumber *miles 
    

    ich schreibe wie

    self.miles = [coder decodeObjectForKey:@"miles"] 
    

    im initWithCoder Methode

    und

    [aCoder encodeObject:_miles forKey:@"miles"] 
    

    in der encodeWithCoder Methode.

Die Daten werden jedoch nicht in der PLIST-Datei gespeichert. Bitte beraten.

+0

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

Antwort

0

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 
Verwandte Themen