奇怪的ARC问题不释放在UIView子类伊娃

可能重复:
为什么在使用ARC + NSZombieEnabled时不会释放对象

我目前在一个项目中看到了一个很奇怪的问题。 简而言之,我拥有拥有ViewBstrong属性)的ViewBViewA在其初始化ViewA创build其ViewB 。 这两个对象都是UIView子类。

我已经覆盖dealloc在两个,并把一个日志行和一个断点,看看他们是否受到打击。 看来ViewAdealloc正在被打但不是ViewB的。 但是,如果我在ViewAdealloc中放置一个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方法。 更重要的是,如果我在ViewAdeallocViewA的话,这真是太疯狂了。

我发现这似乎是在僵尸的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无关。