【问题标题】:Why would an iOS app act differently on two different devices?为什么一个 iOS 应用在两个不同的设备上会有不同的表现?
【发布时间】:2013-05-31 14:01:19
【问题描述】:

如果您使用 Xcode 开发 iOS 应用程序并在不同设备上对其进行测试,那么考虑到设备型号相同且软件版本相同,是否有任何理由说明为什么它的行为会有所不同?

例如,我最近一直在开发一个应用程序。该应用程序的干净构建被放置在两个不同的 iPhone5s 上。 (软件版本相同)

但是,在其中一部手机上运行时,我会收到类似于以下内容的内存释放错误:

*** -[CFString release]: message sent to deallocated instance

在其他设备上,不会出现此类错误。

是否有任何明显的理由说明为什么任何应用都会出现这种情况?

【问题讨论】:

  • 释放了哪个字符串?发布代码,以便我们更好地理解。
  • 部分问题是,我实际上不知道这发生在哪里或字符串在哪里被释放。这很奇怪。
  • 你试过在所有异常上设置断点吗?
  • 两个版本的构建设置(即优化级别)是否相同?在使用 ARC 启用和自动释放的对象进行编译并启动优化时,我遇到了类似的情况..
  • 是的,我尝试过使用断点等单步执行代码。我只是不知道如何调试这个问题。

标签: ios memory-management crash


【解决方案1】:

您的代码在不同设备上的行为可能没有不同。该问题很可能存在于您的所有设备上,但只会在某些情况下导致问题。您无法预测自动释放池中的对象何时被释放,但您可以确定它并不总是以相同的时间进行。在不同的设备上运行,自动释放池的排空时间可能会因其他后台进程、内存使用等原因而有所不同。

您看到的释放错误很可能是由于您对自动释放的对象进行了 release 调用,而您没有对自己调用 retain。检查您在没有 init 调用的情况下创建的对象的代码,但您正在调用 release 的位置。另外,请尝试在 Instruments 中启用 Zombie Objects 来运行您的代码,看看您是否可以找到导致问题的 NSString 对象。

【讨论】:

    【解决方案2】:

    您的字符串被保留或释放。当您尝试访问已释放的对象时会出现此问题。可能是您的字符串在您访问它之前就被释放了。我遇到了这个问题。

    使用 Zombies 模板在 Instruments 中运行您的应用。这将向您显示哪个对象存在内存问题,并让您查看该对象的整个保留/释放历史记录。这应该会为您指明正确的方向。

    僵尸启用

    option+cmnd+r
    

    然后选择Enable Zombie Objects,然后选择Run

    【讨论】:

    • 一个问题是使用模拟器运行应用程序不会由于某种原因触发此错误。我可以在实际设备上运行应用程序时使用 Zombies 模板吗?我以前从未这样做过。
    • 是的,如果您有开发人员配置,则可以启用。
    • 我是否必须将其附加到特定进程才能执行此操作?
    • 我们明天可以谈谈吗。因为时间已经过去了,所以很抱歉给您带来不便。
    • 你试过在模拟器上模拟内存警告吗?它在硬件菜单下。这通常会导致出现任何内存问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多