Ios 关于非常古老的弧前Objective-C代码的问题

Ios 关于非常古老的弧前Objective-C代码的问题,ios,objective-c,Ios,Objective C,我们有一个应用程序,它的代码非常混乱,是由其他开发公司很久以前创建的。最近我们发现里面有一个bug。经过数小时的调试,我们发现,如果在使用某个ViewController时注释掉其中一个release命令,那么代码就可以完美地工作。我的问题是: 注释掉release命令是否会导致严重的内存泄漏 最近几天的ARC是否可以处理此问题(仍然可以在没有释放命令的情况下释放内存) 如果我像通常编写ARC代码那样添加代码,那么旧代码和新代码会共存于同一个文件中吗 代码太旧了,所以我们不想冒险将其转换为ARC

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

  • 注释掉release命令是否会导致严重的内存泄漏
  • 最近几天的ARC是否可以处理此问题(仍然可以在没有释放命令的情况下释放内存)
  • 如果我像通常编写ARC代码那样添加代码,那么旧代码和新代码会共存于同一个文件中吗
  • 代码太旧了,所以我们不想冒险将其转换为ARC代码。如果上述问题3的答案是肯定的,那么我们改变它会舒服得多

  • 不看代码是不可能说出的。可能是的

  • 是-ARC为您进行内存管理

  • 否。ARC是在文件级别完成的-不能在同一文件中组合ARC和非ARC代码,启用ARC将导致所有调用
    保留
    释放
    自动释放
    编译错误

  • 1) 它可能会导致“严重的”内存泄漏,具体取决于将泄漏的对象类型以及分配的次数(如果它位于一个迭代次数为百万次的循环中,该怎么办?:-)

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

    3) 正如答案2中所写的,不,它们不能共存于同一个文件中

    最后,隐藏错误通常是一种糟糕的做法,它会在将来给您带来很多工作……我建议您添加产生错误的代码,也许有人可以帮您解决

  • ,如果不释放对象,它们很可能“挂起”在内存中,程序无法访问
  • 使用ARC的全部原因是为了自动处理内存。因此,是,它将释放内存而不使用
    release
    消息。(事实上,当您尝试使用
    release
    指令构建标记为ARC的文件时,编译器会抛出一个错误。)
  • 不完全是。这是可能的,但不是没有
    clang
    中提供的一些

  • 随机删除
    release
    与从某个变量中随机减去1是一样的,因为您有一个off by one错误,现在它“似乎工作得更好”。是的,它绝对会导致更多问题。简单地添加和删除
    retain
    release
    ,直到它“似乎起作用”,内存管理是不安全的

    我的建议是让Xcode为您将代码转换为ARC(编辑>重构>转换为Objective-C ARC…)如果您以前有不正确的内存管理,这并不能保证修复它(特别是保留循环),但它会自动解决大量错误。除此之外,还需要调试内存管理中的错误


    如果无法将此代码转换为ARC,请运行静态分析器(Cmd-Shift-B)。无论如何,您都应该这样做,即使在转换为圆弧之后。有很多内存问题是它找不到的,但它可以解决很多问题。

    很抱歉,您不得不以艰难的方式看到这一点

  • 很有可能。一个视图在弧前阶段可能会占用大量内存,如果不正确释放属性,一行代码可能会泄漏大量内存(如果多次调用)。我以前做过这件事,当ARC被引入时,我非常激动,这就是魔法。而且,如果你想看到准确的结果,你会喜欢仪器中的泄漏工具

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

  • 不,至少没有官方支持。可能会有一些魔力,但在未来的版本中可能会或可能不会打破,而且你(肯定)不想冒险


  • 恐怕上面的答案都不能让你感觉好一点,所以你最好开始解决这个问题,最好是以弧形的方式解决。

    对于第一个答案,它是一个定制的UIViewController,需要取消,这个UIViewController可能永远不会在用户每次使用应用程序时被分配超过10次。这会导致大泄漏吗?答案总是“视情况而定”。VC本身使用的内存并不多,但如果它保留了其他对象呢?例如图像、按钮、视图、ecc?所有这些对象都将与静态分析器的VC+1一起泄漏。我在内存管理方面不是特别“擅长”,但这在很多情况下帮了我的忙。