Цель-C: почему мой NSString не сохраняет свою ценность? - PullRequest
1 голос
/ 05 ноября 2011

Проблема заключается в методе initWithCoder. Когда я хочу извлечь «Coins_Key» из того места, где я его сохранил, вызвав метод «saveData» в моем «основном» классе, и я передаю ключ «self.keyName», значение keyName равно 0.

//Class coins.h
@property (retain) NSString* keyName;
@property (retain) NSString* keyValue;

//Class coins.m
@synthesize keyName;
-(void) saveData:(NSString *)number: (NSString *)keyID 
{
    self.keyName = keyID;
    self.keyValue = number;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
     NSLog(@"Encoded keyName: %@", keyName);
    [encoder encodeObject:keyValue forKey:keyName];
}
- (id)initWithCoder:(NSCoder *)decoder {
    self.keyValue = [decoder decodeObjectForKey:self.keyName];
    NSLog(@"Decoded Coins: %@", self.keyValue);
    return self;
}

//Class main
[Coins *coin3 = [[Coins alloc] init];
[coin3 saveData:@"6" :@"Coins_Key"];        
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:coin3];
coin3 = [NSKeyedUnarchiver unarchiveObjectWithData:data];

1 Ответ

1 голос
/ 05 ноября 2011

Вы не совсем понимаете рабочий процесс кодера / декодера.

Правильно используя методы encodeObjectForKey: и decodeObjectForKey:, вы должны передать в качестве аргумента ключ , который следует использовать для хранения значения. Этот ключ должен оставаться постоянным.

Вы также не должны требовать от вызывающих абонентов предоставлять ключ, используемый вашим Coin объектом для хранения данных. Возьмите этот простой пример как более правильный / эффективный метод (при условии, что я понимаю цель вашего класса):

// Class Coins.h

@property (assign) int numberOfCoins;

// Класс Coins.m

#define NUM_COINS_KEY @"NUM_COINS_KEY"

@synthesize numberOfCoins;

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) { // Use [super initWithCoder:decoder] here if your superclass supports it
        self.numberOfCoins = [decoder decodeIntForKey:NUM_COINS_KEY];
        NSLog(@"Decoded Coins: %d", self.numberOfCoins);
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
     NSLog(@"Encoded keyName: %@", keyName);
    [encoder encodeInt:self.numberOfCoins forKey:NUM_COINS_KEY];
}

// Класс main

Coins *coin = [[Coins alloc] init];
coin.numberOfCoins = 6;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:coin];
[coin release]; // If you're just playing around, this is probably overkill, but a good habit
coin = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...