NSKeyedArchiver unarchiveObjectWithData возвращает объект с нулевыми значениями

Файл UserBean .h

@property (assign, readwrite) NSString *user;
@property (assign, readwrite) NSString *timestamp;
@property (assign, readwrite) NSString *password;
@property (assign, readwrite) NSString *source_id;
@property (assign, readwrite) NSString *fullname;
@property (assign, readwrite) NSString *email;
@property (assign, readwrite) NSString *reset_code;

- (void)encodeWithCoder:(NSCoder *)encoder;
- (id)initWithCoder:(NSCoder *)decoder;

Файл UserBean .m

- (void)encodeWithCoder:(NSCoder *)encoder {
    //Encode properties, other class variables, etc
    [encoder encodeObject:self.email forKey:@"email"];
    [encoder encodeObject:self.user forKey:@"username"];
    [encoder encodeObject:self.fullname forKey:@"fullname"];
    [encoder encodeObject:self.password forKey:@"password"];
    [encoder encodeObject:self.source_id forKey:@"id"];
    [encoder encodeObject:self.timestamp forKey:@"timestamp"];
}
- (id)initWithCoder:(NSCoder *)decoder {
    if((self = [super init])) {
        //decode properties, other class vars
        self.email = [decoder decodeObjectForKey:@"email"];
        self.user = [decoder decodeObjectForKey:@"username"];
        self.fullname = [decoder decodeObjectForKey:@"fullname"];
        self.password = [decoder decodeObjectForKey:@"password"];
        self.source_id = [decoder decodeObjectForKey:@"id"];
        self.timestamp = [decoder decodeObjectForKey:@"timestamp"];
    }
    return self;
}

Здесь я сохраняю и возвращаю объект класса userbean

- (UserBean *)getUser                       {
    NSError *error;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *encodedObject = [defaults objectForKey:@"user"];
    if (@available(iOS 9.0, *)) {
        UserBean *userBean = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:encodedObject error:&error];
        return userBean;
    } else {
        UserBean *userBean = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
        return userBean;
    }
}
- (void)saveUser:(UserBean *)userBean       {
    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:userBean];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:encodedObject forKey:@"user"];
    [defaults synchronize];
}

отсюда я устанавливаю атрибуты объекта и сохраняю

- (void)saveUser:(StandardPacket *)packet               {
    NSDictionary *dataDict = [packet.data objectAtIndex:0];
    UserBean *userBean = [[UserBean alloc] init];

    userBean.user = [NSString stringWithFormat:@"%@",[dataDict objectForKey:@"username"]];
    userBean.email = [NSString stringWithFormat:@"%@",[dataDict objectForKey:@"email"]];
    userBean.fullname = [NSString stringWithFormat:@"%@",[dataDict objectForKey:@"fullname"]];
    userBean.password = [NSString stringWithFormat:@"%@",[dataDict objectForKey:@"password"]];
    userBean.source_id = [NSString stringWithFormat:@"%@",[dataDict objectForKey:@"id"]];

    userBean.timestamp = @"AA";
    userBean.reset_code = @"AA";

    [[SharedPrefences defaults] saveUser:userBean];
}

но когда я извлекаю объект из SharedPreferences, я получаю объект с нулевыми значениями и другим мусором

Тема 1: EXC_BAD_ACCESS (код = 1, адрес = 0xa17e4c52)

значения из объекта userbean после извлечения

пользователь UserBean * 0x17e604e0 _user NSString * 0x17ea9fe0

_timestamp NSString * 0x17ea7a50

_пароль NSString * 0x17e605c0

_source_id NSString * 0x17e679d0

_fullname NSString * 0x17ea9e50

_email NSString * 0x17e9a880

_reset_code NSString * ноль 0x00000000


person Asad Ali    schedule 07.08.2018    source источник


Ответы (1)


Вам не хватает функции кодирования in encodeWithCoder:(NSCoder *)encoder.

[encoder encodeObject:self.reset_code forKey:@"reset_code"];

Также добавьте в initWithCoder:(NSCoder *) функцию декодера.

 self.reset_code = [decoder decodeObjectForKey:@"reset_code"];

Надеюсь, поможет.

person Bhavin Kansagara    schedule 07.08.2018
comment
спасибо, но я понял, что проблема была с @property (назначение, чтение и запись) (тип свойства), он выпускал значения из атрибутов - person Asad Ali; 08.08.2018
comment
добро пожаловать. Я думаю, что это не единственная проблема, потому что из журнала ошибок, как вы можете видеть, _reset_code NSString * nil 0x00000000 равен нулю. который не кодируется и, следовательно, при декодировании равен нулю. В любом случае, здорово, что вы решили проблему. - person Bhavin Kansagara; 08.08.2018