我在dealloc of a view中执行此操作
[baseTable release];
在头文件中,我声明如下:
IBOutlet UITableView *baseTable;
....
@property(nonatomic, retain) UITableView *baseTable;
出于某种原因,我在dealloc中得到了“EXC_BAD _ACCESS”。当我评论出上述内容时,一切都很顺利。如何确定UITableView和发布的具体内容?
答案 0 :(得分:4)
如果您想了解EXC_BAD_ACCESS错误的确切原因,请启用NSZombie,这样每当您在解除分配的对象上调用任何方法时,它都会准确地告诉您哪个对象及其方法。
启用NSZombie:
要禁用它,请删除该值,或者如果您希望稍后再将其取消,请取消选中该值。一定要不要打开它,因为它在启用时实际上并没有解除分配!
答案 1 :(得分:1)
我的猜测是你在某个地方发布过多次baseTable,看看你发布它的地方没有保留。
每个保留必须有一个且只有一个版本,从那里开始,看看你如何去。棘手的一点就是确保无论你在哪里传递baseTable对象,释放/保持匹配。所以它不会像[baseTable release]上的grep那么简单并且不幸地计算它们:)
答案 2 :(得分:1)
听起来你过度释放baseTable
。如果没有看到更多的代码,很难说可能会发生什么。您是否在任何时候将该表的所有权授予自动释放池?当您自动释放对象时,您将所有权转移到自动释放池,并且您需要确保放弃该对象(并且可能nil
输出其实例变量。
您需要检查baseTable
的每次使用,并确保任何可能拥有该表所有权的对象在释放之前保留它。另请记住,您可能通过别名作为UITableViewDelegate
或UITableViewDataSource
方法的参数来引用表对象。
答案 3 :(得分:-1)
当您使用属性时保留检查是否
if(self.tableView!=nil)
{
self.tableView = nil;
}
在dealloc中。通过这种方式,您将检查表视图是否为nil,并且它是nil,您将其设置为nil。