我是objective-c(以及Apple的所有事情)的新手。在不同的类中释放/访问同一个名字的不同对象
我在设计一个iOS应用程序,并遇到了一个对我来说很有趣的bug。基本上,我开始在一个VC(LoginViewController)中,并沿着我将另一个VC推到我的导航控制器(MyProfileViewController)的方式。
但是当我通过堆栈回到LoginViewController时,触摸屏幕上的任何对象都会导致出现EXEC_BAD_ACCESS
错误。在一些头部划伤之后,我决定改变视图中的表名(我的两个ViewControllers都包含一个UITableView
,在他们各自的.m文件中定义,并且我将这两个命名为'myTable')。
事实证明,对于我的应用程序来说,除了导致可读性差(您不必在这一点上反对我),将两个表命名为导致崩溃的原因相同。所以我想,当MyProfileViewController被释放时,它从LoginViewController释放'myTable'以及?
有了正常的错误,我意识到自己的错误,试着从中学习,然后继续前进。但是这对我而言并没有意义,为什么它首先会造成崩溃。任何见解?作为参考,下面是我在两个ViewController中定义和释放UITableView的方法。
@implementation MyProfileViewController//same format as LoginViewController
UITableView* myTable;//It's since been renamed to something more descriptive
//code...
-(void)viewDidLoad{
[super viewDidLoad];
myTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStyleGrouped];
[myUpdateTable setDataSource:self];
[myTable setDelegate:self];
[self.view addSubview:myTable];
}
//code...
-(void)dealloc{
[myTable release];
[super dealloc];
}
理想情况下,这不应该发生。你可以尝试一件事。在释放表之前选择相同的名称并在dealloc中,首先编写这两行代码 - tableView.delegate = nil; tableView.datasource = nil; – rishi
这里一定还有别的事情要做。这些名称只在其范围内有效,在这种情况下仅为自己的对象。在'LoginViewController'的'viewDidUnload'中有什么有趣的事情发生? –
嗯。 @rishi我试着在dealloc中设置委托和数据源为零,但它没有影响任何东西。 Phillip Mills我认为这可能是一个很好的检查位置,所以我评论了一切,但[超级viewDidUnload],它仍然在发生。这很奇怪。 – user1080952