应用程序在发布模式下崩溃,但在启用僵尸时不会崩溃

时间:2015-11-29 02:05:37

标签: ios objective-c

我正在试图找出我的应用程序出了什么问题。它在发布模式下崩溃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;

}

我在这里有哪些其他调试选项?

谢谢!

2 个答案:

答案 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"];
}