NSMutableDictionary обрабатывается как NSDictionary - PullRequest
2 голосов
/ 06 апреля 2010

У меня есть простой класс с переменной члена NSMutableDictionary.Однако, когда я вызываю setObject: forKey, я получаю сообщение об ошибке («метод мутации отправлен в неизменяемый объект»).Источник проблемы очевиден из отладчика - мой 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 ]

1 голос
/ 06 апреля 2010

Ваш код работает для меня без каких-либо изменений. Я создал инструмент командной строки на основе 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] Модель: счастливая

Как говорит Кенни ТМ, ваше использование себя немного неправильно. в вашем init общий шаблон

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

Позже в коде вы должны использовать self.piers.

Попробуйте создать проект, подобный моему, и посмотрите, сохраняется ли проблема. Вы, вероятно, обнаружите, что проблема в другом месте.

0 голосов
/ 06 апреля 2010

Попробуйте удалить self..

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

В ObjC обозначение

obj.prop = sth;

эквивалентно

[obj setProp:sth];

, который имеет совершенно другую семантику, чем

obj->prop = sth;

Хотя это маловероятно, но, вероятно, ваш изменяемый словарь станет неизменным во время процедуры -setPiers:. Просто скажите «Нет» self.anything (пока не поймете, как работает свойство).

...