【发布时间】:2013-09-26 10:46:09
【问题描述】:
我目前正在修复一个不是使用 ARC 构建的旧版应用程序上的一些 iOS 7 显示问题,并且在 iOS 版本 6 和 7 之间遇到了与 dealloc 方法不一致的行为。我不能在任何文档或社区讨论中找到有关这些更改的任何其他提及,所以我想知道这里是否有人可以阐明这里发生的事情?
我之前的代码,(在 iOS6 中工作,看起来像这样):
@interface MyViewController()
@property (retain) AdHandler *adHandler;
@end
@implementation MyViewController
@synthesize adHandler = _adHandler;
- (id) initWithAdHandler:(AdHandler*)anAdHandler
{
self = [super init];
_adHandler = [anAdHandler retain];
return self;
}
- (void)dealloc
{
[super dealloc];
[_adHandler release];
_adHandler = nil;
}
...
@end
在iOS 6中单步执行代码时,我发现dealloc语句之后,[_adHandler retainCount]仍然是正数,并且对象仍然可用。
然而,在 iOS 7 中,dealloc 语句之后,retainCount 以某种方式达到零,并且_adHandler 对象一直是dealloc'd,因此我对release 的调用会导致EXC_BAD_ACCESS .
我可以通过将我的 [adHandler release] 呼叫移动到 dealloc 呼叫之前来解决此问题,但我的问题是为什么会发生这种情况?为什么dealloc 释放它不负责的对象?是否有任何文档说明为什么 dealloc 行为会以这种方式发生变化?
【问题讨论】:
-
在非 ARC 应用程序中实现
-dealloc时,[super dealloc]应该是最后一个语句,而不是第一个。 -
如果您使用工具,您可以准确了解对象上发生保留/释放/自动释放的位置
-
你的init方法也不正确。
-
@majackson 你需要做
self = [super init]; if (self) { ... initialization junk } return self;标准模式。而且,正如其他人所说,retainCount完全没用,即使用于调试也是如此。
标签: ios objective-c xcode ios7 reference-counting