我正在尝试调试为什么我的一个视图控制器没有调用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方法。我不知道从哪里开始寻找......
答案 0 :(得分:1)
你有一个指向你的viewController对象的实例变量吗?如果仍有指针,即使视图不在屏幕上,也不会减少保留计数。
不寻常的保留计数是正常的。唯一重要的计数是0.如果它是0,它将被解除分配。无法保证一个指针意味着保留计数为1。