Я строю модель для MVC и испытываю аномалию, когда вопреки документации Apple "Значения, возвращаемые из NSUserDefaults, являются неизменяемыми, даже если вы устанавливаете изменяемый объект в качестве значения . ", объект [[NSUserDefaults standardUserDefaults] objectForKey: @" key "] возвращает массив mutable .
Я создал пустое приложение для iOS в Xcode 4D199, чтобы заново создать условие и подтвердить, что оно не отвечает другим факторам в моем проекте.
Я устанавливаю NSMutableArray, как показано:
- (void)setupTest
{
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
[mutableArray addObject:@"one"];
[mutableArray addObject:@"two"];
[[NSUserDefaults standardUserDefaults] setObject:mutableArray forKey:@"mutableArray_01"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
и я получаю объект, как показано:
- (void)checkTest
{
NSMutableArray *mutableArrayInCheck = nil;
id whatIsThis = [[NSUserDefaults standardUserDefaults] objectForKey:@"mutableArray_01"];
if([whatIsThis isKindOfClass:[NSMutableArray class]])
{
NSLog(@"The array is mutable.");
mutableArrayInCheck = (NSMutableArray *)whatIsThis;
}
if([whatIsThis isKindOfClass:[NSArray class]])
{
NSLog(@"The array is immutable.");
}
if ([whatIsThis isMemberOfClass:[NSMutableArray class]])
{
NSLog(@"The array is a member of NSMutableArray class");
}
if (mutableArrayInCheck)
{
[mutableArrayInCheck addObject:@"three"];
NSLog([mutableArrayInCheck description]);
}
}
Теперь, согласно документации Apple, можно ожидать, что консоль будет отображать только неизменную строку . Но когда я выполняю код, в консоли отображаются следующие строки:
2012-01-05 18:47:33.328 Tester_01[78533:f803] The array is mutable.
2012-01-05 18:47:33.348 Tester_01[78533:f803] The array is immutable.
2012-01-05 18:47:33.349 Tester_01[78533:f803] (
one,
two,
three
)
Итак, мне интересно, есть ли здесь что-то, чего мне не хватает.
Для получения дополнительной информации код, выполняющий тесты, выглядит так:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
BOOL setupKey = NO;
if (setupKey)
{
[self setupTest];
}
BOOL checkKey = YES;
if (checkKey)
{
[self checkTest];
}
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Изначально я запустил проект с setupKey , установленным на ДА . После первого запуска я изменил setupKey на NO . Журнал консоли является результатом, в то время как setupKey был установлен на NO . Дайте мне знать, что вы думаете.