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 作为私有属性的类 - 这样您就不会对字典做任何奇怪的事情,但仍然不能包装它的功能。这是一个很好的原则,可以普遍遵循!


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


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

上面的代码片段之一。如果你这样做 - 请尊重内存管理:

- (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 回答