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行为以这种方式改变的任何文档?
在[super dealloc]
实例是垃圾之后,无论发生什么都是随机的和非确定性的.正如@Bneely所写,[super dealloc]
必须是最后的.
最佳实践:转换为ARC.
至于retainCount
,没有保证它的价值可能是什么,不使用它,它只是造成混乱.在您的情况下,您通过调用来销毁类实例[super dealloc]
,然后期望实例的行为就像它仍然存在一样.它不能,它已被破坏,现在只是内存中的一些非确定性位.
归档时间: |
|
查看次数: |
2397 次 |
最近记录: |