Ios 关于非常古老的弧前Objective-C代码的问题
我们有一个应用程序,它的代码非常混乱,是由其他开发公司很久以前创建的。最近我们发现里面有一个bug。经过数小时的调试,我们发现,如果在使用某个ViewController时注释掉其中一个release命令,那么代码就可以完美地工作。我的问题是:Ios 关于非常古老的弧前Objective-C代码的问题,ios,objective-c,Ios,Objective C,我们有一个应用程序,它的代码非常混乱,是由其他开发公司很久以前创建的。最近我们发现里面有一个bug。经过数小时的调试,我们发现,如果在使用某个ViewController时注释掉其中一个release命令,那么代码就可以完美地工作。我的问题是: 注释掉release命令是否会导致严重的内存泄漏 最近几天的ARC是否可以处理此问题(仍然可以在没有释放命令的情况下释放内存) 如果我像通常编写ARC代码那样添加代码,那么旧代码和新代码会共存于同一个文件中吗 代码太旧了,所以我们不想冒险将其转换为ARC
保留
、释放
和自动释放
编译错误release
消息。(事实上,当您尝试使用release
指令构建标记为ARC的文件时,编译器会抛出一个错误。)clang
中提供的一些随机删除
release
与从某个变量中随机减去1是一样的,因为您有一个off by one错误,现在它“似乎工作得更好”。是的,它绝对会导致更多问题。简单地添加和删除retain
和release
,直到它“似乎起作用”,内存管理是不安全的
我的建议是让Xcode为您将代码转换为ARC(编辑>重构>转换为Objective-C ARC…)如果您以前有不正确的内存管理,这并不能保证修复它(特别是保留循环),但它会自动解决大量错误。除此之外,还需要调试内存管理中的错误
如果无法将此代码转换为ARC,请运行静态分析器(Cmd-Shift-B)。无论如何,您都应该这样做,即使在转换为圆弧之后。有很多内存问题是它找不到的,但它可以解决很多问题。很抱歉,您不得不以艰难的方式看到这一点
恐怕上面的答案都不能让你感觉好一点,所以你最好开始解决这个问题,最好是以弧形的方式解决。对于第一个答案,它是一个定制的UIViewController,需要取消,这个UIViewController可能永远不会在用户每次使用应用程序时被分配超过10次。这会导致大泄漏吗?答案总是“视情况而定”。VC本身使用的内存并不多,但如果它保留了其他对象呢?例如图像、按钮、视图、ecc?所有这些对象都将与静态分析器的VC+1一起泄漏。我在内存管理方面不是特别“擅长”,但这在很多情况下帮了我的忙。