0

NSMutableDictionary を継承するクラスを作成しようとしています。このクラスに基づいてオブジェクトを初期化すると、常に null が返されます。

Class:
- (NSMutableDictionary*) init
{
self = [super init];
if (self)
{
    self = [[NSUserDefaults standardUserDefaults] objectForKey: MasterKey];
}

return self;
} 

Init object:
if (self.masterDict == nil)
{
    self.masterDict = [[CardlyMasterDictionary alloc] init];
}

デバッグするとpo [self masterDict]、0x0000000 で nil オブジェクトを呼び出して返します。NSMutableDictionary を正しくインスタンス化するために必要な別の手順はありますか?

4

2 に答える 2

3

これをしないでください!

(編集 @newacct がコメントしたように、ドキュメントにNSDictionary をサブクラス化するための要件に関する詳細があります。ただし、可能であれば実行しないことをお勧めします)。

Apple は、基本的な nsdict、nsset、nsstring などのクラスをサブクラス化しないことをお勧めします。これらは「実際の」クラスではなく、クラス クラスタです。つまり、nsdictionary をインスタンス化するときに、どのクラスを受け取ったか実際にはわからないということです。

すべきことは、プライベート プロパティとして nsdictionary を持つクラスを作成することです。そうすれば、辞書で奇妙なことは何もしていませんが、その機能をラップすることはできません。これは、一般的に従うべきかなり良い原則です!


unit メソッド内に新しいオブジェクトを作成し、それを self で指すのも少し珍しいことです。alloc/init を呼び出すたびに、1 つではなく 2 つのメモリ チャンクが割り当てられます。私はクラスのレベルを作るだろう


PS は、私があなたの質問に答えていないことに気付きました!

nil を取得する理由は、このメソッドを初めて呼び出したときにユーザーのデフォルトに何もないためです。これは、init メソッドが self を nil に設定することを意味します。これが発生した場合は、次のことを行う必要があります

self = [[NSUserDefaults standardUserDefaults] objectForKey: MasterKey];
if (nil == self) {
    self = [nsmutabledictionary new];
    [[NSUserDefaults standardUserDefaults] setObject:self forKey:MasteKey];
}
于 2012-08-25T10:23:57.460 に答える
0

上記のコード スニペットの 1 つ。それを行う場合-メモリ管理を尊重してください:

- (id)init
{
    [self release];
    self = [[NSUserDefaults standardUserDefaults] objectForKey:MasterKey];
    if (self == nil) {
        self = [[NSMutableDictionary alloc] init];
        [[NSUserDefaults standardUserDefaults] setObject:self forKey:MasterKey];
    } else {
        [self retain];
    }
    return self;
}
于 2012-08-25T18:10:21.053 に答える