如何保护对象不被自动释放?

时间:2011-03-23 14:11:44

标签: objective-c iphone memory autorelease

最后,目标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太多而且已经自动释放? 如何防止对象自动释放?

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。正确?