我的应用程序的主视图是视图A,它是一个选项卡控制器。其中一个选项卡特别设置为“加载视图B”。视图B在您单击按钮时,会显示视图C。视图C依次有一个按钮,按下该按钮时,会向其代理(视图B的视图控制器)发送消息,然后该代理会取消视图C。
现在,我的理解是视图A总是引用视图B。是吗?
顺序如下:
-
-
按下按钮显示视图C(模式)。
-
按下按钮关闭-视图C发送消息,视图B的控制器关闭。此时将显示视图B。
-
再重复步骤2-3两次。
-
视图B的视图控制器释放(我在dealloc中有一个NSLog,所以我知道这正在发生)。视图仍会显示。
-
按下按钮显示视图C,得到“EXC\u BAD\u ACCESS”,因为视图B的视图控制器已被释放,所以按钮的“click”消息无处可去。
任何时候都不会出现内存警告-我已经输入了NSLog来确保它。视图A和视图B都是在Interface Builder中构造的,而不是在代码中,而且我所编写的代码中绝对没有调用视图B的dealloc方法的。
这总是在三次重复之后发生。
// create button
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(column*100+24, row*80+10, 64, 64);
[button setImage:thumb forState:UIControlStateNormal];
[button addTarget:self
action:@selector(buttonClicked:)
forControlEvents:UIControlEventTouchUpInside];
所以按钮应该发送“buttonClicked”消息到视图B的视图控制器。前三次运行良好,视图控制器神秘释放后停止工作。
视图B应该
取消分配,因为它是应用程序选项卡栏中显示的顶级视图。
编辑
:有趣的琐事。我在视图B的viewDidLoad中添加了一个[self retain],这将增加对象的保留计数。它做到了:在获得EXC\u BAD\u访问之前,我现在可以执行上述过程四次。我运行的是NSZombiesEnabled,所以我知道是视图B的控制器被释放了。我只需要找出它的retain计数在哪里被递减,因为我实际上没有编写任何这样做的代码。