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