我正在试图找出我的应用程序出了什么问题。它在发布模式下崩溃EXC_BAD_ACCESS,但是当我尝试检查僵尸时,它不会通过仪器崩溃。没有失败,我关闭僵尸检测,它崩溃了。
当崩溃时,我唯一可以告诉的是vm分配中的最新调用显示了这个viewDidLoad。所以我想知道这里有什么问题吗?
- (void)viewDidLoad
{
[super viewDidLoad];
//load abstract
if ( self.abstractId > 0 ){
[self startQuery:@selector(getAbstractWithId:)];
}
//setup nav bar
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
[self.view addSubview:[self makeFavoriteButton]];
//add link attributes
self.linkAttributes = @{NSForegroundColorAttributeName: [UIColor colorWithHexString:emaGreen],
NSUnderlineColorAttributeName: [UIColor lightGrayColor],
NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)};
//create text view
UITextView *tv = [[UITextView alloc] initWithFrame:self.view.frame];
tv.editable = NO;
tv.textAlignment = NSTextAlignmentLeft;
tv.text = @" ";
tv.backgroundColor = [UIColor whiteColor];
tv.scrollEnabled = YES;
tv.dataDetectorTypes = UIDataDetectorTypeLink;
tv.linkTextAttributes = self.linkAttributes; // customizes the appearance of links
tv.delegate = self;
// set the scroll indicators between nav and tabs
tv.scrollIndicatorInsets = UIEdgeInsetsMake(0,
0,
CGRectGetHeight(self.tabBarController.tabBar.frame),
0);
//add to property and view
self.tv = tv;
[self.view addSubview:tv];
//Create spinner view
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
hud.mode = MBProgressHUDModeIndeterminate;
self.hud = hud;
}
我在这里有哪些其他调试选项?
谢谢!
答案 0 :(得分:2)
我猜这就是这条线:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
引用UIControl
的参数文档:
target:目标对象 - 即发送操作消息的对象。如果这是nil,则在响应者链中搜索愿意响应动作消息的对象
操作:标识操作消息的选择器。它不能为NULL
奇怪的是,这没有为UIBarButtonItem
的初始值设定项指定,但我认为没有理由为什么它也不应该是真的,除非该类实际检查null
的这些参数并且行为相应
也许您的栏按钮项目正在尝试访问null
选择器以发送它并在那里崩溃,或者正在尝试将其发送到已经发布的某个对象。这可能只是通过一些优化引起的 - 例如,可能在发布模式下,按钮抓取指向消息发送调用的函数的指针,而不是发送消息,作为优化。
至少,通过nil
似乎有错误。
答案 1 :(得分:1)
感谢您的评论。奇怪的是,我终于在僵尸中得到了一个控制台输出,出现以下KVO错误message received but not handled.
我能够追踪到dealloc'd时未被移除的观察者。最糟糕的错误。啊。谢谢你的帮助!
-(void)dealloc
{
[self.queryQueue removeObserver:self forKeyPath:@"operations"];
}