我正在努力弄清楚如何正确设置我的视图控制器以优雅地处理内存警告。
目前,只要应用收到内存警告,我就会从导航控制器堆栈中的视图中获得EXC_BAD_ACCESS崩溃。
我的表视图发生了错误的访问。这是我实例化它的方式:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
UITableView *table = [[[UITableView alloc] initWithFrame:CGRectMake(self.view.bounds.origin.x, self.view.bounds.origin.y, self.view.bounds.size.width, self.view.bounds.size.height - self.navigationController.navigationBar.bounds.size.height) style:UITableViewStyleGrouped] autorelease];
table.dataSource = self;
table.delegate = self;
self.tableView = table;
[self.view addSubview:table];
[table release];
...other stuff...
}
这是我的viewDidUnload:
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.tableView = nil;
}
发出内存警告时,会按预期调用viewDidUnload,但我在self.tableView = nil
行上遇到EXC_BAD_ACCESS崩溃。
我是否在错误的地方设置了tableView?我没有使用nib文件,所以我应该在其他地方构建它吗?我以某种方式错误地将它传递给视图控制器?等等
非常感谢任何帮助。我仍然没有理解在记忆警告时发生的事件序列,并且1级记忆警告似乎是令人讨厌的常见。
答案 0 :(得分:2)
您在release
上拨打table
两次;在您创建时,使用{em> deferred 版本与autorelease
一起发布,并在将其添加为[table release];
的子视图后再次使用self.view
。请记住,如果tableView
的属性为“保留”,则它将在分配时保留(使用点语法分配时) - 并且,addSubview在添加时也会保留table
。所以,你只需要将autorelease
留在那里 - 因为延迟发布(当你说self.tableView = table;
时会发生保留,这会平衡。
答案 1 :(得分:2)
试试这个:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
UITableView *table = [[[UITableView alloc] initWithFrame:CGRectMake(self.view.bounds.origin.x, self.view.bounds.origin.y, self.view.bounds.size.width, self.view.bounds.size.height - self.navigationController.navigationBar.bounds.size.height) style:UITableViewStyleGrouped] autorelease];
table.dataSource = self;
table.delegate = self;
self.tableView = table;
[self.view addSubview:table];
//[table release]; You have already release table with autorelease.
...other stuff...
}