我在弄清楚如何正确设置我的视图控制器以优雅地处理内存警告方面有些挣扎。

此刻,每当应用程序收到内存警告时,我都会从导航控制器堆栈中更远的视图中看到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级内存警告似乎很讨厌。

最佳答案

您正在release上两次调用table;在创建时,使用autorelease推迟发布,在将其添加为[table release];的子视图后再次使用self.view。请记住,如果tableView的属性为'retain',则它将在赋值时保留(使用点语法赋值时),并且addSubview在添加时也将保留table。因此,您只需要将autorelease留在此处-因为该延迟发行(这将由您说self.tableView = table;时发生的保留所抵消。

关于iphone - 多 View 应用中的iOS内存警告tableView EXC_BAD_ACCESS崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9406369/

10-11 16:14