我在视图的 dealloc 中这样做
[baseTable release];
在头文件中,我这样声明:
IBOutlet UITableView *baseTable;
....
@property(nonatomic, retain) UITableView *baseTable;
出于某种原因,我在 dealloc 中得到一个“EXC_BAD _ACCESS”。当我注释掉上面的行时,一切都很好。如何确定 UITableView 和发布的具体情况?
我在视图的 dealloc 中这样做
[baseTable release];
在头文件中,我这样声明:
IBOutlet UITableView *baseTable;
....
@property(nonatomic, retain) UITableView *baseTable;
出于某种原因,我在 dealloc 中得到一个“EXC_BAD _ACCESS”。当我注释掉上面的行时,一切都很好。如何确定 UITableView 和发布的具体情况?
如果您想找出 EXC_BAD_ACCESS 错误的确切原因,请启用 NSZombie,这样无论何时您调用已释放对象的任何方法,它都会准确地告诉您它是什么对象以及它是什么方法。
要启用 NSZombie:
要禁用它,请删除该值或取消选中它,如果您想稍后再次打开它。一定不要让它打开,因为它在启用时实际上并没有释放任何东西!
我的猜测是您在某个地方发布了太多次 baseTable,请寻找一个您在没有保留的情况下发布它的地方。
每次保留都必须有一个且只有一个版本,从那里开始,看看你是怎么做的。棘手的一点是确保无论您传递 baseTable 对象,释放/保留都匹配。因此,它不会像 [baseTable release] 上的 grep 那样简单,不幸的是:)
听起来你过度释放了baseTable
。如果不查看更多代码,很难说这可能发生在哪里。您是否随时将该表的所有权授予自动释放池?当您自动释放一个对象时,您将所有权转移到自动释放池,您需要确保放弃该对象(并可能nil
放弃它的实例变量)。
您需要检查每次使用baseTable
并确保任何可能承担表所有权的对象在释放它之前保留它。还请记住,您可能通过别名作为UITableViewDelegate
orUITableViewDataSource
方法的参数来引用表对象。
当您使用 Retain 属性时,请检查是否
if(self.tableView!=nil)
{
self.tableView = nil;
}
在 dealloc.In 这种方式中,您正在检查表视图是否为 nil,并且您正在将其变为 nil。