【问题标题】:how to get nullpointer exception in Objective C如何在Objective C中获取空指针异常
【发布时间】:2015-04-12 22:57:16
【问题描述】:

众所周知,在 ObjectiveC 中,我们可以向 nil 对象发送消息,并且不会抛出空指针异常。但这也使一些错误难以发现。那么在我们这样的调试中执行代码时,有没有办法让程序抛出空指针异常或崩溃。

NSString * s = nil;

int n = [s intValue]; 

我希望这段代码可以让程序崩溃,这样我可以更容易地找出这个错误。

【问题讨论】:

  • 您应该阅读异常编程指南并考虑使用 NSAssert 宏。
  • 我建议,如果您编写 Objective-C 代码,请顺其自然。很多时候传递一个 nil 指针是没有问题的。如果这是一个问题,NSAssert 是你的朋友。
  • @Tirth:你做过任何 Objective-C 编程吗?代码将运行良好并将 n 设置为 0。
  • 您可以在 objc_msgSend 中使用断点,条件是第一个参数为零。这种方法的问题是它会一直中断。所有的框架都向 nil 发送消息。
  • @NikolaiRuhe 你的方法是我想要的,但是我们如何为 objc_msgsend 设置断点呢?我们只有objc_msgSend的头文件(/user/include/objc/message.h),如果我们在头文件中给这个函数下断点,这个断点就没有用了。

标签: objective-c nullpointerexception null


【解决方案1】:

您可以对要使用的每个对象使用安全检查方法。

我更喜欢 NSObject 类的类别

@implementation NSObject (Utility)
    +(id)checkSafe:(id)obj{
        if( obj == nil){
        [NSException raise:@"null pointer" format:@"Reason"];
    }
    return self;
  }
@end

现在您可以在任何 nil 对象中使用此方法,如下所示。 我使用了简单的 NSObject 本身。 sand 使用复制方法使其崩溃。

NSObject* valuenil = nil;
NSObject* valuCopy = [[NSObject checkSafe:valuenil] copy];

【讨论】:

  • 感谢您的回答,但我想要的是在不更改原始代码时如何使其崩溃。所以我可以找出一些潜在的错误,比如我们使用了一些我们忘记分配的指针。
  • 例如ViewController中的tableView属性。但是,事实上,我们忘记了赋予财产真正的价值。但程序运行良好。所以我想要一个简单的方法来找出这样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多