Я смущен насчет функции поиска в 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. Таким образом, эти мои вопросы:
- КСН, есть способ, чтобы удалить один из пять стандартных доменов из списка поиска объекта
NSUserDefaults
? Обратите внимание, что это необязательно должен быть объект, возвращенныйstandardUserDefaults
, я был бы счастлив создать свой собственный объект. В случае, если это имеет значение: я особенно заинтересован в избавлении отNSRegistrationDomain
. - Если ответ на вышеизложенное «нет», можем ли мы сказать, что пять стандартных доменов просто «неизменяемы» и что все вещи в
NSUserDefaults
о добавлении/удалении пакетов и постоянных/изменчивых доменах относятся к пользовательским доменам ? - Есть ли способ узнать, что находится в списке поиска объекта
NSUserDefaults
?
Я подозреваю, что уже знаю ответы (нет, да и нет), но по крайней мере я ищу кого-то, у кого больше опыта, чтобы подтвердить мои подозрения.
Элементы 'NSRegistrationDomain' заданы разработчиком, поэтому вы их устанавливаете, а затем хотите игнорировать их? – zaph
@CocoaFu: Да, это так. Это связано с моим классом, который хочет выполнить обновление пользовательских настроек по умолчанию в более новом формате, и я предпочел бы, чтобы я мог написать класс таким образом, чтобы он работал независимо от того, имеют ли значения по умолчанию для домена регистрации уже загружен. Однако имейте в виду, что цель задать мне вопрос не в том, чтобы решить эту конкретную проблему (у меня уже есть решение), но для выяснения того, можно ли изменить стандартный список поиска «NSUserDefaults» , Я считаю, что документы довольно запутанны в этом отношении. – herzbube