Возможно ли для подкласса NSObject "подключаться" к каждому доступу к свойству

У меня есть объект, который я сериализирую для сохранения на диск, и иногда при обновлении моего приложения добавляются новые свойства (например, prefs приложения). Новое свойство не будет существовать на старом объекте, поэтому, естественно, [myObj myNewProperty] оценил бы до нуля. Я хочу изменить это, чтобы я мог вернуть что-то релевантное, и желательно делать это, не переопределяя геттер для каждого свойства. Это возможно?

2 ответа

Вы можете установить значение по умолчанию при декодировании вашего объекта:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self.myNewProperty = [aDecoder decodeObjectForKey:@"myNewProperty"];
    if(!self.myNewProperty)
    {
        self.myNewProperty = ...(The new value here!);
    }
    return self;
}

Вы можете записать версию при сериализации и вернуться при десериализации, а затем проверить, обращаетесь ли вы к объекту старой версии или к новому с дополнительными свойствами, как показано ниже

#define kVersionKey @"Version"

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeInt:1 forKey:kVersionKey];
   // other encoding
}

- (id)initWithCoder:(NSCoder *)decoder {
    int i=[decoder decodeIntForKey:kVersionKey];
   if (i==1) {
        // set your new property
    }
    // other decodings
}
Другие вопросы по тегам