2

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 として扱われるようにするには、何が欠けていますか? ありがとう!

4

2 に答える 2

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 が言うように、self の使い方は少し間違っています。あなたのinitでは、一般的なパターンは

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

コードの後半では、 を使用する必要がありますself.piers

私のようなプロジェクトを作成してみて、問題がまだ存在するかどうかを確認してください。おそらく、問題が別の場所にあることがわかります。

于 2010-04-06T11:19:14.677 に答える
0

を削除してみてくださいself.

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

ObjC では、表記は

obj.prop = sth;

と同等です

[obj setProp:sth];

とはまったく異なるセマンティックを持っています

obj->prop = sth;

-setPiers:可能性は非常に低いですが、可変辞書は手順中に不変になる可能性があります。self.anything(プロパティの仕組みを理解するまで)いいえとだけ言ってください。

于 2010-04-06T07:45:43.187 に答える