NSMutableDictionary被视为NSDictionary

时间:2010-04-06 07:32:35

标签: objective-c cocoa nsdictionary nsmutabledictionary

我有一个带有NSMutableDictionary成员变量的简单类。但是,当我调用setObject:forKey时,我收到一个错误('mutating方法发送到不可变对象')。从调试器中可以看出问题的根源 - 我的NSMutableDictionary实际上是NSDictionary类型。

我必须遗漏一些非常简单的东西,但似乎无法修复它。以下是相关代码:

// Model.h
@interface Model : NSObject {
    NSMutableDictionary *piers;
}
@property (nonatomic,retain) NSMutableDictionary *piers;
@end


// Model.m
@implementation Model
@synthesize piers;

-(id) init {
 if (self = [super init]) {
     self.piers = [[NSMutableDictionary alloc] initWithCapacity:2];
        [self createModel];
    }
    return self;
}

-(void) createModel {
 [piers setObject:@"happy" forKey:@"foobar"];  
}
@end

如果我在代码中的任何地方放置一个断点并调查self.piers,它的类型为NSDictionary。我错过了什么,所以它被视为NSMutableDictionary而不是?谢谢!

2 个答案:

答案 0 :(得分:1)

您的代码无需任何修改即可适用于我。我使用以下代码创建了基于Foundation的命令行工具(Mac OS X):

#import <Foundation/Foundation.h>

// Model.h
@interface Model : NSObject {
    NSMutableDictionary *piers;
}
@property (nonatomic,retain) NSMutableDictionary *piers;

-(void) createModel;

@end


// Model.m
@implementation Model
@synthesize piers;

-(id) init {
    if (self = [super init]) {
        self.piers = [[NSMutableDictionary alloc] initWithCapacity:2];
        [self createModel];
    }
    return self;
}

-(void) createModel {
    [piers setObject:@"happy" forKey:@"foobar"];  
}
@end

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    Model *model = [[Model alloc] init];

    NSLog(@"Model: %@", [model.piers objectForKey:@"foobar"]);

    [pool drain];
    return 0;
}

它给了我预期的输出:

2010-04-06 12:10:19.510型号[3967:a0f]型号:开心

正如KennyTM所说,你对自我的使用有点不对劲。在init中,一般模式是

NSMutableDictionary *aPiers = [[NSMutableDictionary alloc] initWithCapacity:2];
self.piers = aPiers;
[aPiers release];

稍后在代码中,您应该使用self.piers

尝试制作像我一样的项目,看看问题是否仍然存在。您可能会发现问题出在其他地方。

答案 1 :(得分:0)

尝试删除self.

 piers = [[NSMutableDictionary alloc] initWithCapacity:2];

在ObjC中,符号

obj.prop = sth;

相当于

[obj setProp:sth];

完全不同的语义
obj->prop = sth;

尽管可能性很小,但在-setPiers:过程中,您的可变字典可能会变得不可变。只要对self.anything说“不”(直到你理解财产如何运作)。