奇怪的ARC问题不释放在UIView子类伊娃
可能重复:
为什么在使用ARC + NSZombieEnabled时不会释放对象
我目前在一个项目中看到了一个很奇怪的问题。 简而言之,我拥有拥有ViewB
( strong
属性)的ViewB
。 ViewA
在其初始化ViewA
创build其ViewB
。 这两个对象都是UIView
子类。
我已经覆盖dealloc
在两个,并把一个日志行和一个断点,看看他们是否受到打击。 看来ViewA
的dealloc
正在被打但不是ViewB
的。 但是,如果我在ViewA
的dealloc
中放置一个self.viewB = nil
,那么它会被击中。
所以基本上是这样的:
@interface ViewA : UIView @property (nonatomic, strong) ViewB *viewB; @end @implementation ViewA - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.viewB = [[ViewB alloc] initWithFrame:self.bounds]; [self addSubview:self.viewB]; } return self; } - (void)dealloc { //self.viewB = nil; ///< Toggling this commented/uncommented changes if ViewB's dealloc gets called. NSLog(@"ViewA dealloc"); } @end
我无法理解的是为什么viewB
out viewB
。 如果其他东西持有viewB
那么它应该是完全没有区别,如果我把它删除或不在这里。 而且它也不会影响ARC增加的版本数量。
我似乎还没有在最小的testing案例中重现,但我正在努力。 我不能发布我看到这个不幸的实际代码。 我不认为这是一个问题,因为更重要的一点是,如果我不知道这个问题,我不知道该怎么办。
任何人都可以看到我忽略的任何东西,或给出关于在哪里寻找debugging这个问题的build议?
更新:
我发现了这个问题。 看来只有当NSZombieEnabled
设置为YES
时才是一个问题。 那么这完全是疯了,肯定是一个错误。 就我所知,僵尸不应该影响这种工作方式。 对象仍然应该通过dealloc
方法。 更重要的是,如果我在ViewA
的dealloc
中ViewA
的话,这真是太疯狂了。
我发现这似乎是在僵尸的iOS实施中的错误。 考虑下面的代码:
#import <Foundation/Foundation.h> @interface ClassB : NSObject @end @implementation ClassB - (id)init { if ((self = [super init])) { } return self; } - (void)dealloc { NSLog(@"ClassB dealloc"); } @end @interface ClassA : NSObject @property (nonatomic, strong) ClassB *b; @end @implementation ClassA @synthesize b; - (id)init { if ((self = [super init])) { b = [[ClassB alloc] init]; } return self; } - (void)dealloc { NSLog(@"ClassA dealloc"); } @end int main() { ClassA *a = [[ClassA alloc] init]; return 0; }
这应该输出:
ClassA dealloc ClassB dealloc
但是当NSZombieEnabled
设置为YES
,它会输出:
ClassA dealloc
据我所知,这是一个错误。 它似乎只发生在iOS(包括模拟器和设备),并且在Mac OS X上构build和运行时不会发生。我已经向苹果提交了一个雷达。
编辑:事实certificate,这已经在这里回答 – 为什么对象不使用ARC + NSZombieEnabled dealloc'ed 。 在我发现真正的问题之后find了它。 顺便说一下,这与ARC无关。