【问题标题】:Correctly debugging IPhone Apps on XCode在 XCode 上正确调试 iPhone 应用程序
【发布时间】:2010-09-13 15:23:35
【问题描述】:

下面这行有错误,你能用肉眼看到吗?

NSString *title = [sender titleForState:UIControlStateNormal];
NSString *newText = [[NSString alloc] initWithFormat:"%@ button pressed.", title];

当 Iphone 模拟器执行此行时,它在没有任何其他信息的情况下崩溃。我一定遗漏了一些关于调试的东西。控制台什么也没显示。

我能够找出错误,我的问题与此无关。我的问题是为什么在没有 XCode 帮助的情况下我会遇到严重的崩溃。在没有任何线索的情况下,我花了宝贵的 5 分钟才意识到我的错字。

有什么建议吗?或者在为 iPhone 编程时,我只需要非常小心拼写错误?

编辑:我猜有些人并没有像我一样立即看到它。错误是字符串常量缺少“@”。所以现在我的问题是为什么 XCode/Simulator 没有向我显示任何类型的错误消息,只是在没有任何线索的情况下崩溃了。 我是否缺少有关调试的内容?

【问题讨论】:

  • 行执行前title的值是多少?
  • 请告诉我们错误 - 我确定不会启动xcode,粘贴代码,......找出。
  • 我在代码中添加了title的值。
  • 您应该在该行收到警告。不幸的是,我不在 Mac 上,因此无法验证是否收到警告。
  • 如果这需要 10 分钟才能找到,那么您不应该为 iphone 编码。你应该发现这甚至没有运行代码,只是为了更仔细地查看警告。

标签: iphone xcode iphone-sdk-3.0


【解决方案1】:

Objective-C 不会在编译期间或运行时强烈验证您传递给消息的参数的类型是否正确。它应该给你一个警告。这里你传递一个 c 字符串而不是一个 NSString。因为 NSString 是对象(因此使用指针引用),所以您的方法使用它作为指针,而您用一个简单的字符串提供它。然后您可能会尝试访问无法访问的内存块...

【讨论】:

  • 谢谢。我想我没有遗漏任何东西,这就是它应该如何工作的。硬崩溃。甚至没有给出硬崩溃的行。我不得不使用断点。这个问题只是为了了解我是否必须习惯这种痛苦的调试过程,或者是否有更好的方法在 XCode 上进行调试。
  • 我很好奇您为什么没有收到任何警告。为了确定,我在我的机器上的 Xcode 中输入了你的代码,它给了我一个“警告:从不兼容的指针类型传递 'initWithFormat:' 的参数 1”警告。
【解决方案2】:

我认为您在“按下%@ 按钮”之前错过了@。 正确的应该是:

NSString *newText = [[NSString alloc] initWithFormat:@"%@ button pressed.", title];

所有常量 NSString 都应该是@"SOMETHING HERE";

【讨论】:

  • 好的。漂亮的眼睛。但问题是为什么我没有从 XCode/Simulator 那里得到帮助来发现那个错误。它只是硬崩溃。我是否遗漏了有关在 XCode / Simulator 上进行调试的内容?
  • downvotes 是不合适的,因为 OP 不会告诉我们错误,这是很好的信息。
  • 为什么这被否决了? “你能用肉眼看到吗”以问号结尾,并且在问题中的 EDIT 之前进行 ans。
【解决方案3】:

检查编译警告。这就是你所需要的。在您展示的案例中,您将收到一个适当的警告,提醒您该行可能会发生坏事。

【讨论】:

    【解决方案4】:

    编译代码时出现以下错误:

    error: cannot convert 'const char*' to 'NSString*' in argument passing
    

    不知道你需要做什么才能让它告诉你,我正在使用 Obj-C++。

    尝试在目标的构建设置下将“-Wall”添加到您的"OtherWarningFlags"

    【讨论】:

    • 我收到警告,但没有收到错误。当应用程序崩溃时,它不会告诉我它崩溃的位置。所以我想这是意料之中的。我只需要寻找警告并非常小心内存崩溃。来自 Java 并不自然,但我可以接受。
    • “不自然”是用词不当。您的编程语言与机器进行不同级别的交互将使编译器的错误和警告更加“重要”。您忽略了有关指针的警告这一事实是您在此级别开发时的第一次也是最重要的学习体验。以后注意这些信息。调试器在这里没有错,调试器是:)
    • 很高兴我能帮上忙。 Obj-C 绝对是一个不同的怪物,听我的建议 - 不要尝试使用 Obj-C++ 的程序!这真的把事情搞砸了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2011-06-11
    相关资源
    最近更新 更多