iOS 7中引用计数的更改?

maj*_*son 1 xcode reference-counting objective-c ios ios7

我正在努力修复一些未使用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
Run Code Online (Sandbox Code Playgroud)

当通过在iOS 6中单步调试代码,我发现后dealloc声明中,[_adHandler retainCount]仍然是积极的,而对象仍然是可用的.

然而,在iOS 7中,在dealloc语句之后,retainCount以某种方式命中零,并且_adHandler对象已经dealloc'd,因此我的调用release导致了EXC_BAD_ACCESS.

我可以通过在[adHandler release]通话前移动我的电话来解决这个dealloc问题,但我的问题是为什么会发生这种情况?为什么dealloc发布它不负责的对象?有没有关于为什么dealloc行为以这种方式改变的任何文档?

zap*_*aph 6

[super dealloc]实例是垃圾之后,无论发生什么都是随机的和非确定性的.正如@Bneely所写,[super dealloc]必须是最后的.

最佳实践:转换为ARC.

至于retainCount,没有保证它的价值可能是什么,不使用它,它只是造成混乱.在您的情况下,您通过调用来销毁类实例[super dealloc],然后期望实例的行为就像它仍然存在一样.它不能,它已被破坏,现在只是内存中的一些非确定性位.