1

次のような NSMutableDictionary 変数と関数を含むヘッダー ファイルがあります。

#import <Foundation/Foundation.h>
@interface Client : NSObject{}; 
@property (assign)NSMutableDictionary *dict;
- (NSMutableDictionary *)myDict;
@end

.m ファイル内

@implementation Client
{
NSMutableDictionary *dict;//=[[NSMutableDictionary alloc]initWithCapacity:10];
}
-(NSMutableDictionary *):myDict{
return dict;
}

私の質問は、辞書を初期化する必要がある場所ですか? Client.myDict のようなものを使用して、プロジェクトのどこからでもアクセスできるようにします。(すべてのキーと値のペアを返す必要があります)

4

1 に答える 1

1

myDictプロパティの値を取得するメソッドを定義していdictます。しかし、コンパイラがそのプロパティを合成するとき、dictgetter メソッドが自動的に合成されるため、メソッドは必要ありませんmyDict。あなたはそれを取り除くことができます。

一般的には、次のようにします。

#import <Foundation/Foundation.h>

@interface Client : NSObject
@property (nonatomic, strong) NSMutableDictionary *dict;
@end

行に中括弧やセミコロンがないことに注意してください@interface

そして、プロパティ (または、技術的には、合成されたインスタンス変数) を初期化する方法に関する質問への回答として、クラスのinitメソッドでそれを行います。

@implementation Client

- (id)init
{
    self = [super init];
    if (self) {
        _dict = [[NSMutableDictionary alloc] init];
    }

    return self;
}

@end

明示的に宣言されたインスタンス変数は必要ないことに注意してください。コンパイラが (先頭にアンダースコアを付けて) 合成するためです。また、「ゲッター」メソッドも作成する必要はありません。コンパイラーがそれを合成するからです。

ARC を使用していた場合 (そうであることを願っています)、上で行ったように、それassignをに置き換えますstrong。ただし、ARC を使用していない場合はそのままにしておきますが、メソッドretainを記述する必要があります (ただし、ARC を使用している場合はこれを記述しないでください)。dealloc

- (void)dealloc
{
    [_dict release];
    [super dealloc];
}

その後、このクラスを次のように使用できます。

Client *client = [[Client alloc] init];
[client.dict addObject:@"One"];

// you can access it this way

NSLog(@"client.dict = %@", client.dict);

// or this way

NSLog(@"[client dict] = %@", [client dict]);
于 2013-11-08T23:36:47.933 に答える