2012-02-05 1 views
8

Я смущен насчет функции поиска в NSUserDefaults. The class reference говорит о методе класса standardUserDefaults, который устанавливает стандартный список поиска, состоящий из пяти доменов. Документы для этого метода следует также, что этот список поиска можно изменить (Смелость добавленный мной):Может ли кто-нибудь объяснить функцию списка поиска в NSUserDefaults?

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

Давайте также посмотрим на документы для 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:. Это не работает, по крайней мере, не на прошивке, где я запускал тесты, но я предполагаю, что это то же самое на Mac OS X. Таким образом, эти мои вопросы:

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

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

+0

Элементы 'NSRegistrationDomain' заданы разработчиком, поэтому вы их устанавливаете, а затем хотите игнорировать их? – zaph

+0

@CocoaFu: Да, это так. Это связано с моим классом, который хочет выполнить обновление пользовательских настроек по умолчанию в более новом формате, и я предпочел бы, чтобы я мог написать класс таким образом, чтобы он работал независимо от того, имеют ли значения по умолчанию для домена регистрации уже загружен. Однако имейте в виду, что цель задать мне вопрос не в том, чтобы решить эту конкретную проблему (у меня уже есть решение), но для выяснения того, можно ли изменить стандартный список поиска «NSUserDefaults» , Я считаю, что документы довольно запутанны в этом отношении. – herzbube

ответ

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

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

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

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

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

+0

Спасибо. Я принимаю ваш ответ, потому что он подтверждает то, что я уже подозревал. Дополнительные идеи по-прежнему приветствуются, хотя :-) – herzbube

0

попробуйте позвонить [myuserDefaults синхронизировать] сразу после модификации

+0

Нет, это не работает. – herzbube

 Смежные вопросы

  • Нет связанных вопросов^_^