【问题标题】:Behavior MutableCopy when object is Nil对象为 Nil 时的行为 MutableCopy
【发布时间】:2012-11-28 15:39:29
【问题描述】:

(我在网上找不到这个)

所有代码都在一个对象中。在 .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 只是为了调试。有趣的部分 这是因为当可以从 NSUserDefaults。但是,如果 @"SOMEKEY" 不可用,则 objectForKey 返回一个 nil 并且定义数组突然是不可变的。即使指定了 mutableCopy。

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

【问题讨论】:

    标签: xcode nsmutablearray immutability mutable


    【解决方案1】:

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

    【讨论】:

    • 我明白你的意思,也同意。但是,当我在加载后立即包含 addObject 语句时,不会添加该值。并且类型仍然是 NonMutable。所以这可能意味着在每个不返回任何内容的 objectForKey 之后,我必须再次分配数组。
    • @Vincent 如果objectForKey: 没有找到它评估为nil 的密钥。这意味着您拥有:definitionArray = nil。这不是你有一个空数组,你只是将你的 ivar 设置为 nil 。我希望这是有道理的......
    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多