【问题标题】:Strange BAD_ACCESS when printing NSInteger打印 NSInteger 时奇怪的 BAD_ACCESS
【发布时间】:2025-12-30 11:50:16
【问题描述】:

这是我第一次在这里问问题,所以请不要对我太苛刻:-)。我有一个奇怪的“错误访问”问题。在我的一个班级中,我有一个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,我还尝试使用各种格式说明符。每次我都可以在设备上运行,但是在模拟器中获取EXC_BAD_ACCESS。

【问题讨论】:

  • 在您的方法中设置一个制动点并读取您的“持续时间”值,我认为当您在那里时它没有设置...
  • 我确实在 NSLog 处设置了一个断点 - myObject 是有效的,并且它在那里有一个有效的持续时间......无论如何谢谢 Marco!
  • 您的代码中没有一个名为 duration 的宏吗?
  • 没有 Nielsbot,我只有一个叫 kDurationTag...谢谢!

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


【解决方案1】:

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

【讨论】:

  • 嘿 Gobra,尝试使用 %qi%qu 并投射到 int 但没有任何变化。我可以选择拳击选项,但想知道我是否在某个地方犯了错误...谢谢您的回答!
【解决方案2】:

当您在调试器中运行应用程序时,在哪里确切地发出信号? Xcode 将向您显示问题的精确行和堆栈。

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

【讨论】:

  • 信号来自stringWithFormat: 方法。感谢 Nikolai 的链接,我已经引用了很多次,但错过了关于平台依赖关系的底部部分。但是,当我使用%ld%lx 并转换为(long)时,它只能在设备(iphone 4)上运行,但在模拟器中它仍然给我一个不好的访问权限。与不使用演员表使用 %d%i 时相同...
【解决方案3】:

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

【讨论】:

  • 我已经做了那个Padavan,我认为这不是问题。谢谢!