#iphone #load #cocos2d-iphone #save #nsuserdefaults
#iPhone #загрузка #cocos2d-iphone #Сохранить #nsuserdefaults
Вопрос:
У меня есть сцена обновления, в которой пользователь может обновлять различные атрибуты игры, и я хочу, чтобы эта информация была сохранена. Например, когда пользователь тратит 1000 баллов на обновление mag на 5, я хочу, чтобы эта информация была сохранена для следующего запуска приложения. Мне сказали, что NSUserDefaults — хороший способ сделать это. Является ли это правильным способом правильного сохранения / загрузки mag int?
-(void)plusFiveMag:(id)sender {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:NSNumber numberWithInt:mag forKey:@"mag"];
mag = 5;
}
-(void)viewDidLoad {
[super viewDidLoad];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:NSNumber numberWithInt:mag forKey:@"mag"];
}
Ответ №1:
Использование средств доступа делает все это намного проще. Использование средств доступа означает, что вам никогда не придется беспокоиться о том, как mag
хранятся внутри, поэтому вы можете прозрачно хранить их в NSUserDefaults
, а не в ivar.
@property (nonatomic, readonly, assign) NSUInteger mag;
NSString * const kMagDefaultsKey = @"mag";
- (NSUInteger)mag {
return [[NSUserDefaults standardUserDefaults] integerForKey:kMagDefaultsKey];
}
- (void)setMag:(NSUInteger)value {
[[NSUserDefaults standardUserDefaults] setInteger:value forKey:kMagDefaultsKey];
}
- (void)addFiveToMag:(id)sender {
self.mag = self.mag 5;
}
Комментарии:
1. Это выглядит не намного проще, чем другой метод. Сработает ли это, если мне нужно будет использовать ‘mag’ и в других местах?
2. Вот что я имею в виду, говоря, что это проще. Другие подходы заставляют вас повторять «установить ivar, а также установить NSUserDefaults» в каждом месте, где вы касаетесь mag. Такой подход помещает их в одно место (средство доступа). До тех пор, пока вы всегда используете «self.mag», он будет прозрачно выполнять правильные действия. Если вы когда-либо измените способ хранения mag, вы исправите это в одном месте, а не в каждом месте, где используется mag. Более того, это избавляет от всех временных проблем, связанных с инициализацией в viewDidLoad (это может выполняться долгое время после создания объекта и может выполняться несколько раз).
3. Дело в том, что я создал ‘mag’ как int в другом классе. Нужно ли изменять его на NSNumber и должен ли я делать что-то особенное, чтобы импортировать его в этот класс?
4. NSUInteger — это просто независимый от платформы unsigned int. Это не объект. Это просто typedef, и, как правило, вы должны использовать вместо «неподписанный». Эквивалентом со знаком является NSInteger. Если вы замените «NSUInteger» на «int» выше, это также будет работать.
5. Как мне импортировать их из класса ‘A’ в класс ‘B’?
Ответ №2:
Сохраните это следующим образом:
-(void)plusFiveMag:(id)sender {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:mag forKey:@"mag"];
mag = 5;
}
Чтобы получить его, вам нужно будет использовать:
-(void)viewDidLoad {
[super viewDidLoad];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int mag = [defaults integerforKey:@"mag"];
}
Комментарии:
1. Этого недостаточно, чтобы определить, где произошла ошибка. В приведенном выше коде нет необходимости. Вставьте вывод консоли. Кстати, как вы создаете mag ivar?
2. Вероятно, в этом проблема. Я создаю его в файле .h другого класса. Проблема в том, что я импортировал это неправильно, я думаю. Я @class’d класс, а затем сделал
@property (nonatomic, assign) int mag;
3. Также изменение
setObject
наsetInteger
выдает мне предупреждение «Передача аргумента 1 из ‘setInteger:forKey:’ преобразует целое число из указателя без приведения