Существует ли лучший способ поместить набор материала в NSUserDefaults?

Удалите точку с запятой после определения функции.

(function (msg){alert(msg)})
('SO');

Выше должно работать.

Страница демонстрации: https://jsfiddle.net/e7ooeq6m/

Я обсуждал этот тип паттерна в этом посте:

jQuery и $ questions

РЕДАКТИРОВАТЬ:

Если вы посмотрите спецификацию сценария ECMA , есть 3 способа определения функции. (Стр. 98, раздел 13 «Определение функций»)

1. Использование конструктора функций

var sum = new Function('a','b', 'return a + b;');
alert(sum(10, 20)); //alerts 30

2. Использование объявления функций.

function sum(a, b)
{
    return a + b;
}

alert(sum(10, 10)); //Alerts 20;

3. Выражение функции

var sum = function(a, b) { return a + b; }

alert(sum(5, 5)); // alerts 10

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

Из спецификации сценария ECMA:

FunctionDeclaration: идентификатор функции (FormalParameterListopt) {FunctionBody}

FunctionExpression: функция Identifieropt (FormalParameterListopt) {FunctionBody} [Function27]

Если вы заметили, «идентификатор» является необязательным для выражения функции. И когда вы не даете идентификатор, вы создаете анонимную функцию. Это не значит, что вы не можете указать идентификатор.

Это означает, что следующее действительно.

var sum = function mySum(a, b) { return a + b; }

Важно отметить, что вы можете использовать 'mySum' только внутри тела функции mySum, а не снаружи. Смотрите следующий пример:

var test1 = function test2() { alert(typeof test2); }

alert(typeof(test2)); //alerts 'undefined', surprise! 

test1(); //alerts 'function' because test2 is a function.

Live Demo

Сравните это с

 function test1() { alert(typeof test1) };

 alert(typeof test1); //alerts 'function'

 test1(); //alerts 'function'

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

Когда у вас есть подобный код,

    function(msg) { alert(msg); }

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

    (function(msg) { alert(msg); })('SO'); //alerts SO.

6
задан Jim Puls 25 June 2009 в 03:30
поделиться

5 ответов

Списки свойств лучше подходят для того, что вы пытаетесь достичь?

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

http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists / ...

5
ответ дан 16 December 2019 в 21:45
поделиться

Вы можете передать NSArray или NSDictionary в NSUserDefaults с помощью setObject: forKey: . Работает отлично. Очевидно, ваш массив беззнаковых символов должен стать массивом NSArray из NSNumbers , что подразумевает некоторые накладные расходы, но, вероятно, это ваш самый простой вариант.

2
ответ дан 16 December 2019 в 21:45
поделиться

Попробуйте использовать объект NSData, который можно напрямую сохранить в NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:[NSData dataWithBytes:array length:len]
                                          forKey:@"someArray"];
1
ответ дан 16 December 2019 в 21:45
поделиться

Чтобы преобразовать массив из 50 элементов C беззнаковых символов в NSArray, который можно сохранить в NSUserDefaults, используя:

NSMutableArray* a = [NSMutableArray new];
for ( int i = 0; i < 50; ++i ) {
    [a addObject:[NSNumber numberWithInteger:yourArray[i]]];
}
[[NSUserDefaults standardUserDefaults] setObject:a forKey:@"theArray"];
[a release];

, чтобы вернуть его:

NSArray* a = [[NSUserDefaults standardUserDefaults] objectForKey:@"theArray"];
for ( int i = 0; i < 50; ++i ) {
    yourArray[i] = [[a objectAtIndex:i] integerValue];
}

Конечно, нет проблем с использованием NSUserDefaults для хранения состояния вашей игры, даже когда оно такое маленькое. Если состояние вашей игры было огромным, вы можете захотеть сохранить его в виде файла plist, но NSUserDefaults не заставит себя ждать, обрабатывая этот тривиальный объем данных.

0
ответ дан 16 December 2019 в 21:45
поделиться

Ого, вам действительно стоит изучить использование Core Data (или просто sqllite) для хранения состояния игры. NSUserDefaults для того, что сказано - значения по умолчанию, настройки конфигурации. На самом деле он не предназначен для хранения больших объемов двоичных данных.

0
ответ дан 16 December 2019 в 21:45
поделиться