objective-c – 什么是“中止陷阱”以及如何调试它?

objective-c – 什么是“中止陷阱”以及如何调试它?,第1张

概述我每次编译项目时都收到此消息: RunIPhoneUnitTest.sh: line 92: 31389 Abort trap "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" -RegisterForSystemEvents 我理解我的代码中存在问题,但后来我没有想到如何解决或找到它. 奇怪的是,我通过这个电话得到了这个: -- This is 我每次编译项目时都收到此消息:
RunIPhoneUnitTest.sh: line 92: 31389 Abort trap              "$TARGET_BUILD_DIR/$EXECUtable_PATH" -RegisterForSystemEvents

我理解我的代码中存在问题,但后来我没有想到如何解决或找到它.

奇怪的是,我通过这个电话得到了这个:

-- This is the interface@interface DbObject : NSObject {    NSInteger ID;    NSDate* timeStamp;}@property (nonatomic) NSInteger ID;@property (nonatomic,retain) NSDate *timeStamp;----This fail with above error----Nsstring * filter = [Nsstring stringWithFormat:"ID = %@",ds.ID,nil];

但是,遗漏的是我删除那条线,那个方法仍然可以得到它!让我疯了.

目前,我正在考虑删除代码,直到没有出现错误&开始添加它,但想知道是否存在更实用的解决方案……

解决方法 中止陷阱通常意味着在某处调用中止.这很有可能发生,因为您的单元测试工具代码抛出了一个不期望的异常,只需通过调用abort(3)来处理它.中止调用不是很容易调试,因为它没有提供有关谁调用它或为什么的信息,从不返回并生成SIGABRT.您可以为SIGABRT安装一个新的处理程序并在那里放置一个断点,然后至少检查当前的调用堆栈……但是首先要阅读其余部分以获取有关为什么会发生这种情况的信息.

但是,上面代码的问题是NSInteger不是对象类型,它是常规原语.要更正错误,请将失败的行替换为:

Nsstring *filter = [Nsstring stringWithFormat:@"ID = %lld",(long long)ds.ID];

首先,stringWithFormat将Nsstring对象作为参数,因此您需要使用“@”字符来指定字符串文字是Nsstring.这非常重要,因为@“blah blah”实际上被翻译成了一个对象.你对stringWithFormat的调用是期望Nsstring对象信息驻留在那个内存地址,但是它获得了一串字符并且很可能在那里爆炸.确保所有字符串文字都是@“blah blah”,其中需要Nsstring类型,并且它们不是简单的c字符串.

其次,格式字符串中的’@’字符指定一个对象.由于NSInteger不是对象,因此不能使用此格式字符.而是使用%lld指定长整数.最后,在使用stringWithFormat时,您不需要在参数列表的末尾添加nil,因为格式字符串本身指定了预期的参数数量.

另外,使用%lld而不是仅使用%d的原因是NSInteger会根据您是编译32位还是64位目标来更改大小.通过将NSInteger提升为long long类型并使用%lld说明符,如果编译为64位并且NSInteger值需要存储超过32位,则确保将来不会出现截断问题.

总结

以上是内存溢出为你收集整理的objective-c – 什么是“中止陷阱”以及如何调试它?全部内容,希望文章能够帮你解决objective-c – 什么是“中止陷阱”以及如何调试它?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239948.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存