我敢打赌,我可以通过阅读此处的类似主题或通过谷歌搜索找到这个问题的答案,但我想直接“听到”它可以这么说,因为这是我理解的反常现象。
所以事情是这样的,我有一些以前的员工写的代码,我看到很多特定类型的结构,这对我来说看起来很奇怪,我只想澄清什么是“对与错”。
例如
- (void) setWwanServiceId: (NSString *) newValue {
[wwanServiceId autorelease];
wwanServiceId = [newValue copy];
}
这wwanServiceId
是NSString
班级的一名成员,对我来说,这似乎是一种奇怪的方式。据我了解,它首先会autorelease
在对象上放置一个,基本上是说:“每当这个对象似乎不被使用时,为我释放它我并不在乎”然后副本将保留计数 +1 .... wwanServiceId?还是新价值?我猜是第一个
然后让我更加困惑,让我们快速浏览一下wwanServiceId
-string 的生命周期..
基本上,如果我们收到一个通知,则该值将被设置,然后通知处理程序方法将调用上述-setWwanServiceId:
方法。除此之外,它只会被访问以供阅读,所以我们可以肯定地说它会在任何给定点:
- 将自动释放放在对象上
- 保留一个新的字符串副本
然后还有一个怪癖,这就是我越来越怀疑的地方,即-dealloc
看起来像这样的方法:
- (void) dealloc {
[[self wwanServiceId] release];
[super dealloc];
}
那么那里会发生什么?正如我所说,它release
的wwanServiceId
内存管理唯一一次被触及(如果我没有错过任何东西,但我很确定)是放置一个自动释放并保留它。
所以总结一下:这里的想法是他认为因为他总是在放置自动释放后保留一个新副本,所以他需要在最后释放它..或者这是我唯一能想到的。或者只是觉得最后做一个额外的发布是安全的,以防万一..?
因为据我了解,如果此设置器被调用一次,它将放置一个autorelease
(-1 将来),执行一个retain
(+1),当调用析构函数时,它将执行“最终释放”(-1)。
任何帮助我理解的想法或建议(如果事实上我错了并且内存处理是正确的)将不胜感激。