Я запутался в функции списка поиска в NSUserDefaults
. Ссылка на класс говорит о методе класса standardUserDefaults
, что он устанавливает стандартный список поиска, состоящий из пяти доменов. Документы для этого метода также подразумевают, что этот список поиска может быть изменен (смелость добавлена мной):
Последующие изменения к стандартному списку поиска остаются в силе даже при повторном вызове этого метода - список поиска гарантированно станет стандартным только при первом вызове этого метода.
Давайте также посмотрим на документы для init
:
Возвращаемое значение: Инициализированный объект NSUserDefaults, чьи домены аргументов и регистрации уже настроены.
Обсуждение: Этот метод не помещает ничего в список поиска.
В моем понимании это противоречие: либо список поиска пуст, либо содержит записи для аргумента и доменов регистрации.
Во всяком случае, я немного поэкспериментировал:
NSUserDefaults* standardUserDefaults = [NSUserDefaults standardUserDefaults];
// We get nil, which is expected
NSLog(@"test 1: expecting nil, getting %@", [standardUserDefaults objectForKey:@"foo"]);
NSDictionary* registrationDomainDefaults = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:42] forKey:@"foo"];
[standardUserDefaults registerDefaults:registrationDomainDefaults];
// We get 42, which is expected
NSLog(@"test 2: expecting 42, getting %@", [standardUserDefaults objectForKey:@"foo"]);
[standardUserDefaults removeSuiteNamed:NSRegistrationDomain];
[standardUserDefaults removeVolatileDomainForName:NSRegistrationDomain];
// Here we get 42!
NSLog(@"test 3: expecting nil, getting %@", [standardUserDefaults objectForKey:@"foo"]);
NSUserDefaults* myUserDefaults = [[NSUserDefaults alloc] init];
// Here we also get 42!
NSLog(@"test 4: expecting nil, getting %@", [myUserDefaults objectForKey:@"foo"]);
[myUserDefaults removeSuiteNamed:NSRegistrationDomain];
[myUserDefaults removeVolatileDomainForName:NSRegistrationDomain];
// We still get 42 *sigh*
NSLog(@"test 5: expecting nil, getting %@", [myUserDefaults objectForKey:@"foo"]);
Как видите, я пытаюсь удалить NSRegistrationDomain
из списка поиска, вызывая как removeSuiteNamed:
, так и removeVolatileDomainForName:
. Это не работает, по крайней мере, на iOS, где я запускал тесты, но я предполагаю, что на Mac OS X то же самое. Так что это мои вопросы:
- В iOS есть ли способ удалить один из пяти стандартных доменов из списка поиска объекта
NSUserDefaults
? Обратите внимание, что это не обязательно должен быть объект, возвращаемый standardUserDefaults
, я был бы рад создать свой собственный объект. В случае, если это имеет значение: мне особенно интересно избавиться от NSRegistrationDomain
.
- Если ответ на вышеприведенный ответ «нет», можем ли мы сказать, что пять стандартных доменов просто «неизменны» и что все, что написано в
NSUserDefaults
о добавлении / удалении наборов и постоянных / изменчивых доменов, касается пользователей? определенные домены?
- Есть ли способ узнать, что находится в списке поиска объекта
NSUserDefaults
?
Я подозреваю, что уже знаю ответы (нет, да и нет), но, по крайней мере, я ищу кого-то с большим опытом, чтобы подтвердить мои подозрения.