NSUserDefaults正在返回一个可变数组

时间:2012-01-06 03:07:13

标签: ios objective-c foundation

我正在构建一个MVC的模型,我遇到了一个异常,与Apple Documentation 相反,“NSUserDefaults返回的值是不可变的,即使你将一个可变对象设置为值。” / strong>,[[NSUserDefaults standardUserDefaults] objectForKey:@“key”]返回可变数组。

我在Xcode 4D199中为iOS创建了一个空应用程序来重新创建条件并确认它对我项目中的其他因素不负责。

我正在设置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]);
    }
}

现在,根据苹果文档,可以预期控制台只显示不可变行。但是当我执行代码时,控制台中会显示以下行:

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 更改为。控制台日志是结果,而 setupKey 设置为。让我知道你的想法。

2 个答案:

答案 0 :(得分:2)

严格地说你是对的。声明“返回的值是不可变的”是令人困惑的,因为这使得看起来像获取可变对象应该不可能。但是,该语句应该被理解为“返回的值不能保证是可变的”。因此,即使您存储了一个可变数组,当您读回该值时,您将获得一个NSArray对象(可能是可变后代类NSMutableArray的对象,但这不能保证并且可能在运行之间有所不同或取决于数组内容)。

答案 1 :(得分:1)

isKindOfClass该方法不适合类集群

下一段是在文档中

在类集群表示的对象上使用此方法时要小心。由于类集群的性质,您获得的对象可能并不总是您期望的类型。如果调用返回类集群的方法,则该方法返回的确切类型是您可以对该对象执行的操作的最佳指示。例如,如果方法返回指向NSArray对象的指针,则不应使用此方法来查看该数组是否可变,如以下代码所示:

 // DO NOT DO THIS!
 //if ([myArray isKindOfClass:[NSMutableArray class]])
 //{
 // Modify the object
 //}