EXC_BAD_ACCESS试图在UIView控制器内加载UITableView

时间:2011-08-05 15:27:16

标签: ios ipad view controller tableview

这开始让我感到疯狂,因为我已经按照我在网上找到的每条指令而仍然无法使用它 - 所有我想做的就是拥有一个包含视图的视图控制器tableview,让视图控制器处理tableview的操作(即作为它的委托和数据源)。

我已经设置了我的视图控制器及其视图,在IB中向视图添加了一个tableview,从视图控制器创建并连接了一个IBOutlet到tableview,并设置了tableview的数据源并委托给了视图控制器。我还确保视图控制器在接口文件中实现UITableViewDelegate和UITableViewDataSource协议。

当我然后将视图控制器的视图添加到窗口时,会出现问题。我在EXC_BAD_ACCESS行收到return UIApplicationMain...错误:

#import <UIKit/UIKit.h>

#import "ClareStreamsAppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([ClareStreamsAppDelegate class]));
    }
}

所以基本上我想知道我在这里做错了什么。据我所知,我已经在Interface Builder中连接了所有内容,但是我需要在代码中进行其他一些初始化吗?还有一个有趣的观点 - 如果我没有连接IB中的tableview的数据源和委托出口,则不会发生错误并且视图加载正常(尽管显然我不能对tableview做任何事情)。 / p>

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

我想我知道是什么导致了你的问题。我前一段时间遇到过同样的问题。发生的事情是,我的UIViews被ARC解除了分配。例如,尝试将此添加到您的UIView的.m文件中,看看它是否被调用:

- (void)dealloc
{
    NSLog(@"This bitchass ARC deleted my UIView.");
}

分辨率非常简单。而不是将你的UIView分配为实例变量,就像这样......

- (IBAction)buttonTouchedUpInside
{
    ViewWithTableView *viewWithTableView = [[ViewWithTableView alloc] init];
    [self.view addSubview:viewWithTableView.view];
}

...你应该在加载你的UIView的父UIView中分配你的UIView:

- (IBAction)buttonTouchedUpInside
{
    self.viewWithTableView = [[ViewWithTableView alloc] init];
    [self.view addSubview:viewWithTableView.view];
}

答案 1 :(得分:0)

正在编辑tableview的数据源而不重新加载tableview。

最佳猜测。

答案 2 :(得分:0)

EXC_BAD_ACCESS表示您已经过度释放了一些变量。首先,查看日志输出并检查消息。最常见的原因是错误地管理您的ivars。确保始终通过您的访问者访问ivars,initdealloc除外。

人们搞砸了这种情况最常见的方式是这样的代码,其中foo是一个ivar:

foo = [NSString stringWithFormat:...]; // Or any method that returns an autorelease

正确的代码是:

self.foo = [NSString stringWithFormat:...];

编辑我忽略了你正在使用ARC。首先,确保您运行的是最新的测试版,并仔细检查日志中的错误。确保你总是使用强/弱的属性,而不是保留/分配。阅读“使用ARC编写发行说明”。

答案 3 :(得分:0)

试试这个:

@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, [NSStringFromClass([ClareStreamsAppDelegate class]) autorelease]);   
}

NSStringFromClass的调用会返回一个自动释放的NSString,但不一定在您的自动释放池中。如果NSStringFromClass设置了自己的池,则它返回的字符串将被释放,因此当UIApplicationMain中的代码向其发送消息时,您将获得EXC_BAD_ACCESS。