iOS 从 MRR 到 ARC

文章出处,原创于 https://HawkingOuYang.github.io/

我的GitHub


iOS 从 MRR 到 ARC

MRR 和 ARC

ARC是 LLVM3.0 iOS5.0 Lion 之后的compile特性,极大地优化了MRR,简化内存管理。核心思想是:ownership,object-graph。
ARC 比 MRR 强多了.
ARC有两部分组成:
front-end complier
optimizer

iOS-MRR-to-ARC-What-Is-MRR-ARC.jpg

(1)MRR是Apple的称法,MRC是民间的称法。
依据 【Apple】 referred to as “manual retain-release” or MRR, you explicitly manage memory by keeping track of objects you own

(2)MRR主要注意: 谁创建(new/alloc/copy/retain) 谁管理(object ownership) 谁释放(release/autorelease); 另注意 GCD 异步的时候,block的生命周期;Core Foundation和Foundation桥接的时候,所有权转移的问题;NSTimer和NSRunloop、GCD之间的关系。

(3)MRR 迁移到 ARC,参考:

Migrating your code to Objective-C ARC

手把手教你ARC——iOS/Mac开发ARC入门和使用

附加参考:

To ARC or not to ARC? What are the pros and cons?

Convert non-ARC to ARC project without recreate it?

Migrating issue from non ARC to ARC with XCode 5.0.2

Migrating your code to Objective-C ARC

Transitioning to ARC Release Notes —————— 这个不错,很详细,推荐。

What is the difference between Objective C automatic reference counting and garbage collection

receiver type * for instance message is a forward declaration (这个很好)

Existing ivar ‘title’ for unsafe_unretained property ‘title’ must be __unsafe_unretained

Receiver type is forward declaration

iOS blocks and strong/weak references to self

MRR 迁移到 ARC

两种方案:

方案A
1、原来使用MRR的 .m文件,保持使用MRR( 即,不改动代码);
2、之后 写新的代码,使用ARC。

方案B
1、原来使用MRR的 .m文件,借助Xcode迁移到ARC(有一部分要手改动);
2、之后 写新的代码,使用ARC。

怎么选择,看项目所处的状态,以及 是否有空闲时间:
如果,项目太庞大了、或者没有空闲时间来改,采用方案A
否则,采用方案B

步骤 a、
Xcode | Edit | Convert —> To Objective-C ARC
iOS-MRR-to-ARC-Xcode-Auto-Convert.png

步骤 b、
(b1)
iWoMail.xcodeproj 文件,在build phases中,把所有原来使用MRR(手动引用释放)的 .m文件,添加标记 -fno-objc-arc 。—————— 注意:原来标记 -f-objc-arc 的文件(主要是任务模块), 这些文件的标记 -f-objc-arc 保持不变。

(b2)
mailcore2.xcodeproj文件,在build phases中,把所有这个开源库中的文件(因为这个开源库用的是MRR) .m文件, 添加标记 -fno-objc-arc 。

(b3)
肉眼观察第三方库的 .m文件,特别对于MRR的第三方库,验证标记是 -fno-objc-arc 。
使用instrument的leak工具,来分析:有没有内存泄漏。

注意:

如果在(b1)和(b2)中,遇到问题,请看:
Transitioning to ARC Release Notes —————— 这个不错,很详细,推荐。

ARCMacro

iOS开发之ARC MRC混编