自定义NSMutableDictionary类

时间:2012-08-25 10:15:28

标签: objective-c ios class nsmutabledictionary

我正在尝试创建一个继承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吗?

2 个答案:

答案 0 :(得分:3)

不要这样做!

(编辑正如@newacct所评论,有关于子类化NSDictionary in the documentation的要求的详细信息。但是,如果可能的话,他们仍然建议不要这样做。)

Apple建议不要继承基本的nsdict,nsset,nsstring等类 - 它们不是“真正的”类,它们是类集群,这意味着当你实例化nsdictionary时实际上并不知道你收到了哪个类。

你应该做的是创建一个具有nsdictionary作为私有属性的类 - 这样你就不会对字典做任何奇怪的事情,但仍然无法包装其功能。这通常是一个非常好的原则!


在单元方法中创建一个新对象并指向它自己也有点不寻常 - 每次调用alloc / init时,你都会分配两块内存而不是一块。我会做一个班级


PS刚刚意识到我没有回答你的问题!

您获得nil的原因是您第一次调用此方法时在您的用户默认值中没有任何内容。这意味着你的init方法将self设置为nil。如果发生这种情况,你需要做

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

答案 1 :(得分: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;
}