Как вытащить строку из NSUserDefaults - PullRequest
2 голосов
/ 16 января 2010

Хорошо, у меня есть свой код, и я считаю, что сузил ошибку сбоя до одного раздела. После загрузки представления мой код загружает NSUserDefaults и вытаскивает строку из них. Затем он работает со строкой. Проблема в том, что я не уверен, как вытащить строку.

Вот соответствующий код:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *nameOne = [prefs stringForKey:@"playerOne"];
NSString *nameTwo = [prefs stringForKey:@"playerTwo"];

//do stuff with the strings

[nameOne release];
[nameTwo release];

Вот также код, когда я помещаю строки в NSUserDefaults в другом представлении:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *tempName = [[NSString alloc] initWithFormat:@"You"];
[prefs setObject:tempName forKey:@"playerOne"];
NSString *tempName2 = [[NSString alloc] initWithFormat:@"Opponent"];
[prefs setObject:tempName2 forKey:@"playerTwo"];
[prefs synchronize];

Я выделил проблему, где я беру строки из NSUserDefaults. Я чувствую, что вывожу их неправильно, но я не уверен, как еще это сделать. Использование StringForKey может быть неправильным ... или не выделять место? Я не уверен, в чем проблема, я пытался исправить это, но безрезультатно. Помощь будет оценена!

Ответы [ 3 ]

2 голосов
/ 16 января 2010

Возможно, вы захотите проверить, являются ли строки, полученные из NSUserDefaults, autorelease d. Кажется, я помню, что они есть.

1 голос
/ 16 января 2010

Я считаю, что вы должны скопировать строки, как показано ниже (или удалить строки выпуска)

NSString *nameOne = [[prefs stringForKey:@"playerOne"] copy];
NSString *nameTwo = [[prefs stringForKey:@"playerTwo"] copy];
0 голосов
/ 16 января 2010

Чтобы добавить ответ Фрэнка Шмитта:

Общее правило: если вы не видите alloc или copy в имени метода, вы можете предположить, что вызывающая сторона не имеет права собственности на возвращаемый объект., если это явно не вызовет сохранение.Так часто возвращаемый объект будет помещен в пул автоматического выпуска.

Так что в этом случае "stringForKey" вызывающая функция не имеет права собственности на возвращаемое значение, поэтому ей не нужно вызывать release.

И если вы хотите сохранить строку после того, как вызывающие функции выйдут из области видимости, вам нужно будет вызвать retain.(Хотя, судя по вашим заявлениям о выпуске, вы этого не сделаете)

Я бы ознакомился с: http://developer.apple.com/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html

...