Xcode 对象为Nil时的行为MutableCopy

Xcode 对象为Nil时的行为MutableCopy,xcode,nsmutablearray,immutability,mutable,Xcode,Nsmutablearray,Immutability,Mutable,(我在网上找不到这个) 所有代码都在一个对象内。在.h文件中,我定义了一个NSMutableArray。我把它分配了 一开始 -(id)init{ self = [super init]; if(self) { definitionArray=[[NSMutableArray alloc] init]; [self initialLoadDefinitionData]; if([definitionArray isKindOfCl

(我在网上找不到这个)

所有代码都在一个对象内。在.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值进行初始化,因此从 初始化。这称为initialLoadDefinitionData:集合非常基本

-(void)loadDefinitionData{
    definitionArray=[[[NSUserDefaults standardUserDefaults] objectForKey:@"SOMEKEY"] mutableCopy];
}
我在init函数中添加了isKindOfClass,只是为了调试。有趣的部分 在这种情况下,当可以从 默认值。但是,如果@“SOMEKEY”不可用,objectForKey将返回 nil和definitionArray突然之间是不可变的。即使指定了mutableCopy

所以我的结论是,如果objectForKey找不到对象,返回值是 不可变。这个结论正确吗?
或者说,可变复制不能因为对象为零而不处理对象吗?

不,你的结论是不对的。如果
objectForKey
返回
nil
,那么您正在向
nil
发送
mutableCopy
消息,该消息当然返回
nil
(在ObjC中发送到
nil
的每条消息都返回
nil
),这就是您看到
else
部分的原因。(数组是不可更改的消息具有误导性,因为此时您甚至没有
NSArray
实例)。

我理解您的说法,也同意您的看法。但是,当我在加载后立即包含addObject语句时,不会添加该值。并且类型仍然是不可更改的。因此,这可能意味着在每个不返回任何内容的objectForKey之后,我必须再次分配数组。@Vincent如果
objectForKey:
没有找到它计算为
nil
的键。这意味着您有:
definitionArray=nil
。这并不是说您有一个空数组,而是将ivar设置为
nil
。我希望这是有意义的。。。