最后,目标c内存管理抓住了我。我现在正在解决一个问题2天。我是Objective C的新手并不能解决我自己的问题。 好像我在不知不觉中过度释放了一个Object。 如果我进行僵尸分析,我会得到“一个Objective-C消息被发送到一个解除分配的对象......”
这是分析日志的重要部分我想: 使用RefCt -1的最后一行显示负责的调用者是 - [XClass数据集]
dataset是一个NSDictionary,用于存储每个对象的数据。 我使用2种方法在两个外部类中使用字典 of XClass(“updateDictionary:”和“dict:”)
档案声明:
XClass.h: ... NSDictionary* dataset; ... @property (retain) NSDictionary *dataset; - (id)initWithDeviceValue:(NSDictionary*)DataSet - (void) updateDictionary:(NSDictionary *)dict; - (NSDictionary *)dict;
XClass.m: @synthesize dataset; -(id)initWithDeviceValue:(NSDictionary*)DataSet{ .. if (self = [super init]) { dataset = DataSet;} } return self; } - (void) updateDictionary:(NSDictionary *)dict{ dataset=[NSDictionary dictionaryWithDictionary:dict]; } -(NSDictionary *)dict{ return dataset; }
调用(dict :)函数的第一个extern方法正确获取实际字典。 第二个函数没有得到字典,因为它似乎被释放了!
就像我说的僵尸日志的最后一行是:
Malloc:Zombie RefCt:-1负责调用者是 - [XClass数据集]
以前有趣的路线:
Zombielog的第2行:
Malloc:CFRetain RefCt:2负责任的来电者: - [XClass数据集]
Zombielog的第3行:
Malloc:Autorelease RefCt:空责任呼叫者: - [XClass 数据集]
似乎我的对象的字典已被自动释放。也许是因为它的RefCt(保留计数?)为2太多而且已经自动释放? 如何防止对象自动释放?
答案 0 :(得分:3)
XClass.m: 试试这个......
@synthesize dataset;
-(id)initWithDeviceValue:(NSDictionary*)DataSet{
..
if (self = [super init])
{
self.dataset = DataSet;
}
return self;
}
- (void) updateDictionary:(NSDictionary *)dict{
self.dataset=[NSDictionary dictionaryWithDictionary:dict];
}
-(NSDictionary *)dict{
return dataset;
}
答案 1 :(得分:0)
@ pawan.mangal
问题解决了!这完全是关于好旧的retainCount。当我从Xclass初始化新对象时,我必须添加一个类似[code][[XClass objectx]retain][/code]
的保留,以便为多个请求保持活动状态。
我还从类中删除了两个方法,让同步的getter和setter完成工作。
每当我使用其自动生成的访问器(在这种情况下为getter)时,对象的retainCount减1。正确?