我目前正在修复一个不是用 ARC 构建的遗留应用程序上的一些 iOS 7 显示问题,并且dealloc
在 iOS 版本 6 和 7 之间遇到了一些不一致的行为。我找不到任何其他提及这些任何文档或社区讨论的变化,所以我想知道这里是否有人可以对这里发生的事情有所了解?
我之前的代码(在 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 行为会以这种方式发生变化?