这开始让我感到疯狂,因为我已经按照我在网上找到的每条指令而仍然无法使用它 - 所有我想做的就是拥有一个包含视图的视图控制器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>
感谢您的帮助!
答案 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,init
和dealloc
除外。
人们搞砸了这种情况最常见的方式是这样的代码,其中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。