iphone - iOS内存警告tableView EXC_BAD_ACCESS在多 View 应用程序中崩溃

标签 iphone ios memory-management exc-bad-access

我正在努力弄清楚如何正确设置我的 View Controller 以优雅地处理内存警告。

目前,每当应用程序收到内存警告时,我都会从导航 Controller 堆栈中更靠后的 View 中收到 EXC_BAD_ACCESS 崩溃。

我的表格 View 发生了错误的访问。这是我实例化它的方式:

- (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 文件,所以我应该在其他地方构建它吗?我是否以某种方式错误地将其传递给 View Controller ?等等等等

任何帮助将非常感激。我仍然没有理解内存警告时发生的事件顺序,而 1 级内存警告似乎非常常见。

最佳答案

您调用release两次 table ;一次与 autorelease 的延迟发布当您创建它时,再次使用 [table release];将其添加为 self.view 的 subview 后.请记住,如果 tableView 的属性是'retain',那么它将在分配时保留(当使用点语法分配时)——并且,addSubview 将保留table添加时也是如此。所以,你只需要离开 autorelease在那里——因为延迟发布(这将被你说 self.tableView = table; 时发生的保留所抵消。

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

相关文章:

R:如何在不耗尽内存的情况下绑定(bind)两个巨大的数据帧

iPhone如何在打字时获取UITextField的文本?

objective-c - 如何阻止 UIScrollView 吞咽触摸

ios - 在 iOS WebView 中获取 PDF 文档高度

ios - 隐藏 UINavigationBar 和状态栏问题

c - realloc 和 calloc 的动态内存分配问题

html - 在 UIWebview 中显示网页时出现对齐问题

iphone - Cocoa/iOS/iPhone 中的模型对象所有权和 MVC

iphone - ARC 中双指针的问题

c++ - 为什么 Allocator::reference 被逐步淘汰?