ARC和非ARC代码协同工作,iOS上的意外行为案例

时间:2014-09-05 07:15:34

标签: ios automatic-ref-counting autorelease

我的iOS项目的代价是如此之大,许多团队参与其中,有些模块是由ARC编写的,而其他模块则不是,理论上这两种技术应该合作得很好。

事实上,对于98%的情况确实如此,罕见的情况会发生意外行为,尤其是ARC管理指针与自动释放非弧形指针一起使用。

请参阅以下代码,billWebPageVC将与@autoreleasepool一起发布,不确定iOS如何使用它?任何有此主题经验的人请提前分享和共同讨论。

PS: 类UPBillWebPageViewController和UPWebData都是ARC,但是推送它的viewcontroller是非弧形的。

UPWebData * webData = [[[UPWebData alloc] initWithLaunchType:ELaunchTypeLocalMerchant poiData:_favorMechModel.data[indexPath.row]] autorelease];

UPBillWebPageViewController* billWebPageVC = [[[UPBillWebPageViewController alloc] initWithWebData:webData] autorelease];

[self.navigationController pushViewController:billWebPageVC animated:YES];

2 个答案:

答案 0 :(得分:0)

如果要在arc项目中添加非弧类,则应在项目设置/构建阶段-fno-objc-arc中添加编译器标志

答案 1 :(得分:0)

Cocoa中的内存管理是本地的。手动内存管理中应该遵循的规则保证了一组标准的不变量,用于跨函数传递的对象的内存管理,因此要在函数中编写正确的内存管理,你只需要关心函数内部的功能,而不是什么其他功能。自动引用计数(ARC)只是一种自动执行这些规则的编译时机制。

只要编译一个函数以正确遵循这些规则,它在运行时与外部代码没有区别,无论它是用MRC还是ARC编写的。用MRC和ARC编写的函数应该没有问题互相交互,因为它们遵循相同的规则集,并且从不假设任何其他函数是用MRC或ARC编写的。

您显示的代码位于MRC中。它看起来很好,并且似乎没有违反任何内存管理规则。它所调用的代码是用MRC还是ARC编写的(它甚至可能是由其他人编译而你甚至不知道它们是如何编译的)完全无关紧要。