2012-08-25 103 views
0

我想創建一個繼承NSMutableDictionary的類。每當我基於這個類初始化一個對象時,它就會返回null。自定義NSMutableDictionary類

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嗎?

回答

3

不要這樣做!

(編輯由於@newacct已經評論,有關於子類NSDictionary的要求的細節in the documentation。但是,他們仍然建議不要這樣做,如果可能的話)。

Apple建議不要繼承基本的nsdict,nsset,nsstring等類 - 它們不是「真正的」類,它們是類集羣,這意味着您實際上不知道在實例化的NSDictionary。

你應該做的是做一個nsdictionary作爲私有屬性的類 - 這樣你就不會對字典做任何奇怪的事情,但仍然不能包裝它的功能。這是一個很好的遵循原則的原則!


這也是有點不尋常你的單位法和點自我內部創建新對象給它 - 每次調用分配/初始化你分配的內存,而不是僅僅一二塊。我會提高班級水平


PS剛剛意識到我沒有回答你的問題!

你得到零的原因是你第一次調用這個方法時你的用戶沒有任何默認值。這意味着你的init方法會將self設置爲零。如果發生這種情況,您需要做

self = [[NSUserDefaults standardUserDefaults] objectForKey: MasterKey]; 
if (nil == self) { 
    self = [nsmutabledictionary new]; 
    [[NSUserDefaults standardUserDefaults] setObject:self forKey:MasteKey]; 
} 
+0

啊謝謝你的洞察力! – Chris

+0

不是真的 - 這些類的文檔有關於子類的一個特殊部分以及如何去做 – newacct

+0

你是對的 - 我編輯了我的答案以包含指向文檔那一點的鏈接 – deanWombourne

0

上面的代碼片段之一。如果你這樣做 - 做內存管理:

- (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; 
}