Cocoa惯性思维调试一例

Posted 大熊猫侯佩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cocoa惯性思维调试一例相关的知识,希望对你有一定的参考价值。

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


人总有惯性思维,在编程调试里也不例外.你总以为错误是显然的那一个,可是结果却不是.

在stroyboard中建立2个UIView控制器,如果按下第一个控制其中的reg按钮则会显示第二个控制器视图:

- (IBAction)reg:(id)sender {
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *regVC = [sb instantiateViewControllerWithIdentifier:@"registerViewController"];
    regVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentViewController:regVC animated:YES completion:^{
        NSLog(@"present Modal View");
    }];
}

更简单的一个方法,然而在运行时,注意是在点击reg按钮时App Crash掉了,错误关键字如下:

send unrecognized selector to instance 0xXXXXXXXX

其中instance就是self本身.想当然的认为肯定是presentViewController:方法导致的,调试时发现App在调用presentViewController:本身并没有出错,而是在reg方法返回后才崩掉.这时还是惯性思维,丝毫没有察觉…

结果错误和presentViewController:没有半毛钱关系,是由于reg按钮上设置了2个回调方法,其中一个已经不存在了…

好吧,事后回过头来看看出错信息:

  • 首先,报的错是self中未找到presentViewController方法,但是self是UIViewController的实例,是不可能没有这个方法的
  • 然后App在presentViewController调用后都没有出错,那么显然由这个方法负责的可能性会很低

由以上2条可以清楚推断出原因不在presentViewController方法,而是另一个不存在self中的方法,到哪里去找显而易见了…

以上是关于Cocoa惯性思维调试一例的主要内容,如果未能解决你的问题,请参考以下文章

人的惯性思维

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

思维惯性的思考-架构师

人的惯性思维

惯性思维是排错的大敌

思维升级这几个学习方法,打破你的思维惯性,带你走向高效人生