Можно ли сохранить целочисленный массив с помощью NSUserDefaults на iPhone?

Можно ли сохранить целочисленный массив с помощью NSUserDefaults на iPhone? У меня есть массив, объявленный в моем файле .h как: int playfield[9][11], который заполняется целыми числами из файла и определяет макет игрового поля. Я хочу иметь несколько слотов для сохранения, где пользователи могут сохранять свои игры. Если я сделаю:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject: playfield forKey: @"slot1Save"];

Я получаю ошибку указателя. Если можно сохранить целочисленный массив, как лучше всего это сделать, а затем получить его позже?

Заранее спасибо!


person user21293    schedule 08.12.2008    source источник


Ответы (4)


Вы можете сохранить и получить массив с помощью оболочки NSData

т.е. (без обработки ошибок)

Сохранять

NSData *data = [NSData dataWithBytes:&playfield length:sizeof(playfield)];
[prefs setObject:data forKey:@"slot1Save"];

Нагрузка

NSData *data = [prefs objectForKey:@"slot1Save"];
memcpy(&playfield, data.bytes, data.length);
person epatel    schedule 08.12.2008
comment
Кажется, работает с использованием memcpy (& playfield, data.bytes, data.length); вместо len.length. Спасибо за быстрый ответ! - person user21293; 09.12.2008
comment
Рассмотрите возможность использования таких функций, как OSSwapHostToLittleInt и OSSwapLittleToHostInt, на случай, если однажды операционная система iPhone по какой-то причине перейдет на big-endian. - person Chris Lundie; 09.12.2008
comment
@epatel Я использовал ваш код для преобразования массива в данные и хранения в NSUserDefaults, но я не могу преобразовать данные в массив. Можно ли получить те же данные обратно в массив с помощью вашего кода? - person Ajay Sharma; 02.02.2012

Из документации Apple по NSUserDefaults:

Значение по умолчанию должно быть списком свойств, то есть экземпляром (или для коллекций комбинацией экземпляров): NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary.

Вот почему вы получаете ошибку указателя.

У вас есть несколько вариантов (в порядке рекомендованного использования):

  1. Use an NSArray of NSArrays to store playField in your application
  2. Keep playField as an array of int, but fill an NSArray with numbers before saving to NSUserDefaults.
  3. Write your own subclass of NSArchiver to convert between an array of integers and NSData.
person e.James    schedule 08.12.2008

Вам нужно будет преобразовать это в объект. Вы можете использовать NSArray или NSDictionary.

person August    schedule 08.12.2008

Просто используйте NSArray вместо обычного массива C, тогда он легко решит вашу проблему.

person leonho    schedule 09.12.2008