打印NSInteger时出现奇怪的BAD_ACCESS

时间:2012-03-05 11:35:42

标签: objective-c ios cocoa-touch memory-management

这是我第一次在这里问一些东西,所以请不要对我太苛刻:-)。我有一个奇怪的“访问不良”问题。在我的一个班级里,我有一个NSInteger和其他一些成员。我重写了- (NSString *)description方法来打印所有类似的值(省略了不相关的部分):

- (NSString *)description {
    return [NSString stringWithFormat:@"Duration:%d", duration];
}

然后我使用NSLog(@"%@", myObject)打印它,它给我EXC_BAD_ACCESS而没有任何日志消息,无论NSZombieEnabled如何。

  • 我仔细检查了所有格式说明符的顺序和 参数 - 这是正确的。
  • 我尝试将格式说明符更改为%i%@,但没有得到任何结果
  • 当我初始化我的对象时,我没有初始化 持续时间。稍后,我通过属性@property NSInteger duration分配它。所以我尝试在init中将持续时间初始化为0 方法但无济于事。
  • 如果我将持续时间设置为之前的NSNumber 印刷,它的工作原理。
  • 当我删除持续时间并离开时 其他ivars再次运作。

我很难过,我在这里做错了什么?    你能救我吗?

非常感谢!

编辑:总结一下,这似乎是由32位和64位平台之间的差异引起的,因为它在iphone 4上运行时很好,并且仅在模拟器中运行时才会出现问题。我尝试了3种不同的方法 - 使用%d%i使用NSInteger变量本身,使用%qi并使用%ld / %lx我也试图转换为intlong以及各种格式说明符。每次我都可以在设备上运行,但在模拟器中获得EXC_BAD_ACCESS。

3 个答案:

答案 0 :(得分:1)

这里唯一的猜测:在你的情况下NSInteger可能是64位而%i(以及%d)需要32位整数,你可以尝试%qi或(看起来更好)显式地转换值。

答案 1 :(得分:0)

当你在调试器中运行应用程序时,提出的信号完全? Xcode将向您显示问题的精确线和堆栈。

当你确定崩溃发生在stringWithFormat:方法中时,它可能是格式说明符的问题。 Apple String Programming Guide contains information关于如何以安全和平台独立的方式处理NSInteger

答案 2 :(得分:-1)

也许你需要综合你的财产?