如何保护对象免受自动释放?
Posted
技术标签:
【中文标题】如何保护对象免受自动释放?【英文标题】:How to protect objects from autorelease? 【发布时间】:2011-03-23 14:11:44 【问题描述】:最后,objective-c 内存管理吸引了我。我现在正在与一个问题作斗争 2 天。我是 Objective C 的新手,无法自己解决问题。 好像我在不知不觉中过度释放了一个对象。 如果我在做僵尸分析,我会得到“一个 Objective-C 消息被发送到一个释放的对象..”
我猜这是分析日志的重要部分: 最后一行 RefCt -1 显示负责的调用者是 -[XClass dataset]
dataset 是一个 NSDictionary,我用来存储每个对象的数据。 我通过使用 2 种方法在两个外部类中使用字典 XClass 的(“updateDictionary:”和“dict:”)
文件声明:
XClass.h: ... NSDictionary* 数据集; ... @property (retain) NSDictionary *dataset; - (id)initWithDeviceValue:(NSDictionary*)DataSet - (void) updateDictionary:(NSDictionary *)dict; - (NSDictionary *)dict; XClass.m: @synthesize 数据集; -(id)initWithDeviceValue:(NSDictionary*)DataSet .. if (self = [超级初始化]) 数据集 = 数据集; 回归自我; - (void) updateDictionary:(NSDictionary *)dict 数据集=[NSDictionary dictionaryWithDictionary:dict]; -(NSDictionary *)dict 返回数据集;调用 (dict:) 函数的第一个外部方法正确获取实际字典。 第二个函数没有得到字典,因为它似乎被释放了!
就像我说的僵尸日志的最后一行是:
马洛克:僵尸 RefCt: -1 负责任的调用者是 -[XClass dataset]
以前有趣的几行:
僵尸日志的第 2 行:
Malloc:CFRetain RefCt:2 负责调用者:-[XClass 数据集]
僵尸日志的第 3 行:
Malloc:Autorelease RefCt:empty 负责任的调用者:-[XClass 数据集]
好像我的对象的字典被自动释放了。也许是因为它的 RefCt(保留计数?) 2 太多了,所以被自动发布了? 如何防止对象被自动释放?
【问题讨论】:
问题是因为你需要使用 self.dataset 才能正确保留它。看看 pawan.mangal 的回答。 【参考方案1】: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;
【讨论】:
非常感谢您的回答,这对我来说很有意义,但是当我编写 self.dataset: EventType:Zombie , RefCt -1, Responsible Library: GraphicsServices, Responsible Caller GSEventRunModal 时,我现在遇到了下一个错误.我可以用 GSEventRunModal 做什么? 我现在收到以下错误:-[XClass setDataset:]: unrecognized selector sent to instance 0x6044820.我的班级没有 setDataset 函数。如何处理这个错误?感谢您的帮助 @property (nonatomic,retain) NSDictionary *dataset;创建属性意味着它为该变量创建访问器方法(get 和 set 方法),如果您在 .m 文件中合成。如果您共享整个代码,则更好。或查看@property 的苹果文档。 谢谢。是的,现在我知道 setDataset 方法来自哪里,它是从属性生成的【参考方案2】:@pawan.mangal
问题解决了!这都是关于旧的 retainCount 的。当我从 Xclass 初始化新对象时,我必须添加一个像 [code][[XClass objectx]retain][/code]
这样的保留,以便让它在多个请求中保持活动状态。
此外,我从类中删除了这两种方法,并让同步的 getter 和 setter 完成工作。
每次我使用它自动生成的访问器(在本例中为 getter)时,对象的 retainCount 减 1。对吧?
【讨论】:
@F***- 很高兴看到你解决了这个问题。我在早期熟悉属性和内存管理花了两个月的时间.....以上是关于如何保护对象免受自动释放?的主要内容,如果未能解决你的问题,请参考以下文章