如何保护对象免受自动释放?

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***- 很高兴看到你解决了这个问题。我在早期熟悉属性和内存管理花了两个月的时间.....

以上是关于如何保护对象免受自动释放?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法保护主节点免受自动缩放?

如何保护此代码免受 SQL 注入?有点迷茫

安全的 NSArray 访问

原子对象是不是受到保护免受竞争条件的影响?

Java:我是不是需要保护 Thread 对象免受垃圾收集器的影响?

如何保护网站免受攻击