Может кто-нибудь объяснить функцию списка поиска в NSUserDefaults? - PullRequest
8 голосов
/ 05 февраля 2012

Я запутался в функции списка поиска в 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 то же самое. Так что это мои вопросы:

  1. В iOS есть ли способ удалить один из пяти стандартных доменов из списка поиска объекта NSUserDefaults? Обратите внимание, что это не обязательно должен быть объект, возвращаемый standardUserDefaults, я был бы рад создать свой собственный объект. В случае, если это имеет значение: мне особенно интересно избавиться от NSRegistrationDomain.
  2. Если ответ на вышеприведенный ответ «нет», можем ли мы сказать, что пять стандартных доменов просто «неизменны» и что все, что написано в NSUserDefaults о добавлении / удалении наборов и постоянных / изменчивых доменов, касается пользователей? определенные домены?
  3. Есть ли способ узнать, что находится в списке поиска объекта NSUserDefaults?

Я подозреваю, что уже знаю ответы (нет, да и нет), но, по крайней мере, я ищу кого-то с большим опытом, чтобы подтвердить мои подозрения.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012
  1. Чтобы избавиться от домена, подобного NSRegistrationDomain, вы должны использовать removeVolatileDomainForName:.Однако это не будет работать с NSRegistrationDomain и NSArgumentDomain.Эти два не могут быть удалены.Попробуйте зарегистрировать собственный домен с setVolatileDomain:forName:.Вы сможете удалить этот.

    Я считаю, что в пяти доменах стандарта UserDefaults вы можете удалить свой собственный домен с помощью removePersistentDomainForName:, передав свой идентификатор пакета.Но я этого не пробовал.

    Поскольку NSGlobalDomain является постоянным, и вы можете передать только свой собственный идентификатор пакета в removePersistentDomainForName:, я думаю, вы не можете удалить NSGlobalDomain.Опять же, это не проверено.

  2. Я так считаю, за исключением постоянного домена с идентификатором вашего пакета.

  3. Нет, но с использованием -volatileDomainNames должно быть достаточно для большинства целей.

0 голосов
/ 08 февраля 2012

попробуйте вызвать [myuserDefaults синхронизировать] сразу после ваших изменений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...