4

(我在网上找不到这个)

所有代码都在一个对象中。在 .h 文件中,我定义了一个 NSMutableArray。我在初始化中分配它。

-(id)init{
    self = [super init];
    if(self) {
        definitionArray=[[NSMutableArray alloc] init];
        [self initialLoadDefinitionData];

        if([definitionArray isKindOfClass:[NSMutableArray class]]) {
           NSLog(@"Array is Mutable");
        } else {
           NSLog(@"Array is Not Mutable");
        }

    }
    return self;
}

我想根据 NSUserDefaults 值进行初始化,所以我从 init 调用另一个函数。这称为 initialLoadDefinitionData:theCollection 是非常基本的。

-(void)loadDefinitionData{
    definitionArray=[[[NSUserDefaults standardUserDefaults] objectForKey:@"SOMEKEY"] mutableCopy];
}

我在 init 函数中添加了 isKindOfClass 仅用于调试目的。有趣的是,当可以从 NSUserDefaults 获取数据时,该 IF 语句返回 MUTABLE。但是,如果 @"SOMEKEY" 不可用,则 objectForKey 返回 nil,并且 definitionArray 突然变为 IMMUTABLE。即使指定了 mutableCopy。

所以我的结论是,如果 objectForKey 找不到对象,则返回值是 NOT MUTABLE。这个结论正确吗?或者不能 MutableCopy 不能处理一个对象,因为它是 Nil 的可变对象?

4

1 回答 1

3

不,你的结论是不对的。如果objectForKey返回nil,那么您发送的mutableCopy消息nil当然会返回nil(发送到nilObjC 中的每条消息都会返回nil),这就是您看到该else部分的原因。(该Array is Not Mutable消息具有误导性,因为此时您甚至没有NSArray实例)。

于 2012-11-28T16:16:03.800 回答