Удалите точку с запятой после определения функции.
(function (msg){alert(msg)})
('SO');
Выше должно работать.
Страница демонстрации: https://jsfiddle.net/e7ooeq6m/
Я обсуждал этот тип паттерна в этом посте:
РЕДАКТИРОВАТЬ:
Если вы посмотрите спецификацию сценария ECMA , есть 3 способа определения функции. (Стр. 98, раздел 13 «Определение функций»)
var sum = new Function('a','b', 'return a + b;');
alert(sum(10, 20)); //alerts 30
function sum(a, b)
{
return a + b;
}
alert(sum(10, 10)); //Alerts 20;
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.
Сравните это с
function test1() { alert(typeof test1) };
alert(typeof test1); //alerts 'function'
test1(); //alerts 'function'
Вооружившись этими знаниями, давайте попробуем проанализируйте ваш код.
Когда у вас есть подобный код,
function(msg) { alert(msg); }
Вы создали выражение функции. И вы можете выполнить это выражение функции, заключив его в круглые скобки.
(function(msg) { alert(msg); })('SO'); //alerts SO.
Списки свойств лучше подходят для того, что вы пытаетесь достичь?
Вы можете создать словарь, сохранить значение для каждого параметра или массива, а затем выгрузить его в Список свойств. Вы можете легко прочитать их или обновить значения на основе ключей.
http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists / ...
Вы можете передать NSArray
или NSDictionary
в NSUserDefaults
с помощью setObject: forKey:
. Работает отлично. Очевидно, ваш массив беззнаковых символов должен стать массивом NSArray
из NSNumbers
, что подразумевает некоторые накладные расходы, но, вероятно, это ваш самый простой вариант.
Попробуйте использовать объект NSData, который можно напрямую сохранить в NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:[NSData dataWithBytes:array length:len]
forKey:@"someArray"];
Чтобы преобразовать массив из 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 не заставит себя ждать, обрабатывая этот тривиальный объем данных.
Ого, вам действительно стоит изучить использование Core Data (или просто sqllite) для хранения состояния игры. NSUserDefaults для того, что сказано - значения по умолчанию, настройки конфигурации. На самом деле он не предназначен для хранения больших объемов двоичных данных.