2014-09-05 44 views
0

我的iOS项目的费用非常庞大,许多团队都参与其中,一些模块由ARC编写,其他模块不是,理论上这两种技术应该合作 - 很好。ARC和非ARC代码共同合作,在iOS上发生意外的行为案例

事实上,对于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]; 
+0

你的意思是你的应用程序在这里崩溃?对不起,我没有得到“billWebPageVC将与@autoreleasepool一起释放”的观点。 – KudoCC 2014-09-05 07:21:54

回答

0

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

只要编译了一个函数以正确地遵循这些规则,它就不会在运行时对外部代码产生影响,无论它是使用MRC还是ARC编写的。用MRC和ARC编写的函数彼此之间应该没有问题,因为它们遵循相同的规则集,并且从不假定任何其他函数都是用MRC或ARC编写的。

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

+0

谢谢。 ARC如何实现autorelease? – jianhua 2014-09-12 03:06:23

+0

@jianhua:我真的不明白你的意思。 autorelease池是一种运行时机制,而ARC是一种编译时机制。根据ARC的规定,ARC可以保留,释放或自动释放事物。 – newacct 2014-09-12 04:16:24

0

如果你想在你的圆弧项目添加非弧线类,你应该添加编译器标志在项目设置/建造阶段可可-fno-objc-arc

+0

当然,如果他没有做到这一点,编译器会看到'release','retain'和'autorelease'关键字时就会出现问题吗? – trojanfoe 2014-09-05 07:43:25