关于非常老的ARC前Objective-C代码的问题

时间:2014-07-21 15:58:03

标签: ios objective-c

我们有一个应用程序,很久以前由其他开发公司创建了超级凌乱的代码。最近我们发现它里面有一个bug。经过几个小时的调试,我们发现如果我们在完成使用时注释掉其中一个ViewController的释放命令,那么代码就可以完美地工作。我的问题是:

  1. 注释掉释放命令会导致大量内存泄漏吗?
  2. 最近几天ARC是否可以解决这个问题(仍然可以在没有发布命令的情况下释放内存)?
  3. 如果我将代码添加为正常编写ARC代码,那么旧代码和新代码会在同一个文件中共存吗?
  4. 代码太旧了,所以我们不想承担将其转换为ARC代码的风险。如果上面问题3的答案是肯定的,那么改变它将会更加舒适。

5 个答案:

答案 0 :(得分:5)

随机删除release与从某个变量中随机减去1相同,因为你有一个一个一个错误,现在它“似乎工作得更好”。是的,它绝对会导致更多问题。只需添加和删除retainrelease,直到“似乎有用”,就无法安全地完成内存管理。

我的建议是让Xcode将您的代码转换为ARC(编辑>重构>转换为Objective-C ARC ....)如果您之前的内存管理不正确,则无法保证解决此问题(特别是保留循环),但它会自动解决很多错误。除此之外,您还需要调试内存管理中的错误。

如果无法将此代码转换为ARC,请运行静态分析器(Cmd-Shift-B)。无论如何,即使转换为ARC,您也应该这样做。它找不到很多内存问题,但它有很多内容。

答案 1 :(得分:2)

1)它可能导致重要的"内存泄漏取决于泄漏的对象类型,以及分配的次数(如果它在一个循环中迭代了数百万次?: - )

2)可以基于每个文件启用/禁用ARC。您不能在同一文件中包含ARC和NON ARC代码。如果您希望ARC处理这种情况,您必须至少转换该文件

3)如答案2中所写,不,他们不能在同一档案中共存。

最后,隐藏错误始终是一种不好的做法,可以在将来为您提供大量工作......我建议您添加代码以便给您错误,也许有人可以帮您解决一下

答案 2 :(得分:0)

  1. 没有看到代码就无法分辨。可能,是的。

  2. 是 - ARC为您进行内存管理。

  3. 没有。 ARC是在文件级别完成的 - 您无法在同一文件中组合ARC和非ARC代码,并且启用ARC将导致对retainreleaseautorelease的所有调用进行编译错误。

答案 3 :(得分:0)

  1. ,在没有发布对象的情况下,他们很可能会#34;闲逛"在内存中,程序无法访问。
  2. 使用ARC的全部原因是自动处理内存。所以,是的,它会在不使用release消息的情况下释放内存。 (实际上,当您尝试使用release指令构建标记为ARC的文件时,编译器会抛出错误。)
  3. 不完全clang中有一些compiler magic可用,但不是没有。{/ li>

答案 4 :(得分:-1)

对不起,你必须以艰难的方式看到这一点。

  1. 很可能。一个单独的视图可以在ARC之前的时代占用大量内存,如果没有正确释放属性,单行代码可能会泄漏大量内存(如果多次调用)。我以前做过这个,并且在ARC推出时非常兴奋,它只是魔术。而且,如果你想看到确切的结果,你会喜欢仪器中的泄漏工具。

  2. 是的!这就是ARC的用途。只有一个坏消息:它要求您将整个文件转换为ARC,而您不想这样做。

  3. 没有。至少没有得到官方的支持。可能会有一些魔力,但在未来的某个版本中可能会或可能不会中断,你(绝对)不想冒险。

  4. 我担心上面的答案都不会让你感觉更好,所以你最好开始解决这个问题,更好的方式是ARC。