Сохранение массива символов на iPhone - PullRequest
0 голосов
/ 27 января 2012

У меня есть массив без знака в c, который мне нужно сохранить на iPhone и при необходимости загрузить обратно.Самый простой способ объяснить содержимое массива char - это просто шестнадцатеричное или аналогичное представление того, сколько раз может быть нажата кнопка.(Хотя это намного сложнее, чем это)

unsigned char myCounter[28];

Я просто хочу знать, как лучше всего сохранить это на iPhone и загрузить обратно в глобальную переменную.Я попытался преобразовать в NSString и обратно.Хотя это работает, я не уверен, как сохранить это в глобальной переменной (доступной для всех моих функций c).

Извините, я совершенно новичок в программировании на C.

Спасибо взаранее

Ответы [ 5 ]

1 голос
/ 27 января 2012

Если это просто произвольные байты, то NSData - лучший OO-способ для представления произвольных байтовых массивов, подобных этому.

NSData *counterAsObject = [NSData dataWithBytes:myCounter length:28];
// and then you can…
[counterAsObject writeToFile:whereverYouWantToStoreIt atomically:YES];

Вы также можете хранить NSData в списках свойств, если это часть более крупной конфигурации, которую вы хотите сохранить все вместе.

Если это должен быть текст, вы можете просто сделать из него NSString (в любом случае, возможно, вы захотите сделать это для взаимодействия с остальной частью Cocoa Touch).

0 голосов
/ 27 января 2012

Я не уверен, хотите ли вы сохранить его в файловой системе или в вашем запущенном приложении (или в обоих).Сохранение в файловую систему может быть выполнено с помощью метода user1118321 и описанного sho.Если вы хотите получить к нему глобальный доступ, мой подход заключается в создании класса с общим экземпляром (singleton).В синглтоне хранится массив, и все время, когда вам потребуется доступ к нему с помощью других классов, вам просто нужно обратиться к синглтону и вызвать метод, который возвращает массив.

Как создавать синглеты: Правильноспособ размещения общего экземпляра (singleton)?

Заголовок класса будет выглядеть следующим образом:

@interface MyClass : NSObject {
    unsigned char *myCounter;
}
...
@end

В вашем методе инициализации MyClass вам необходимо установить указатель с помощью:

...
myCounter = new char[28];
...

И для доступа к счетчику вы можете создать получатель, например:

- (char*)getCounter
{
    return myCounter;
}

Когда бы вы ни хотели получить доступ к массиву, импортируйте заголовок MyClass и ссылайтесь на массив, вызвав:

char *array = [[MyClass sharedInstance] getCounter];

Однако вы не будете знать количество записей в вашем массиве (так как это C-Array).Я бы предложил определить в вашем файле заголовка класса директиву препроцессора, такую ​​как

#define kArraySize 28

, которая может использоваться для выделения массива и определения его размера где-либо еще в вашем коде.Если доступ на запись / чтение к этому массиву очень ограничен, я предлагаю вам использовать NSArray.

0 голосов
/ 27 января 2012

Почему вы не можете использовать NSArray? Гораздо приятнее работать с простыми C-массивами, особенно если вы «совершенно новичок в C-программировании».

0 голосов
/ 27 января 2012

Один простой способ сохранить NSString для последующего использования - через NSUserDefaults.

NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];

// set
[userDefaults setValue:CHAR_ARRAY_CONVERTED_TO_NSSTRING forKey:@"MyKey"];

// get
NSString * savedString = [userDefaults valueForKey:@"MyKey"];
0 голосов
/ 27 января 2012

Если у вас есть NSString, вы можете позвонить:

[myString writeToFile:filePath atomically:YES encoding: NSUTF8StringEncoding error:&myErr];

Вам нужно будет создать filePath. Вероятно, он должен указывать на каталог документов вашего приложения или каталог поддержки приложений.

...