Dealloc没有被召集

时间:2014-11-04 03:27:34

标签: ios automatic-ref-counting

我正在尝试调试为什么我的一个视图控制器没有调用dealloc的覆盖。

我有一个由故事板设置的视图控制器。我已经覆盖了所有3个init方法:

-(id) initWithCoder:(NSCoder *)aDecoder {
    NSLog(@"TestViewController init with coder");

    return [super initWithCoder:aDecoder];
}

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    NSLog(@"TestViewController init with nib name");

    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}

- (id) init {
    NSLog(@"TestViewController init");

    return [super init];
}

当我在我的应用程序中导航到所述视图时,我看到'initWithCoder'按预期调用。这是我看到的唯一一个调用的init方法。当我导航到我的视图时,它会被调用一次。

然而,当我离开我的视图控制器时,dealloc不会被调用。 viewDidDisappear会被调用。在视图didDisappear我记录引用计数:

-(void) viewDidDisappear:(BOOL)animated {
    NSLog(@"TestViewController Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef) self));
    [super viewDidDisappear:animated];
}

参考计数为5。

我还在viewDidLoad中记录了引用计数,它是8。

所以它从5跳到8,然后回到5。

我只看到一次调用的init方法。我不知道从哪里开始寻找......

1 个答案:

答案 0 :(得分:1)

你有一个指向你的viewController对象的实例变量吗?如果仍有指针,即使视图不在屏幕上,也不会减少保留计数。

不寻常的保留计数是正常的。唯一重要的计数是0.如果它是0,它将被解除分配。无法保证一个指针意味着保留计数为1。