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