文章出处,原创于 https://HawkingOuYang.github.io/
iOS 从 MRR 到 ARC
MRR 和 ARC
ARC是 LLVM3.0 iOS5.0 Lion 之后的compile特性,极大地优化了MRR,简化内存管理。核心思想是:ownership,object-graph。
ARC 比 MRR 强多了.
ARC有两部分组成:
front-end complier
optimizer
(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
附加参考:
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
步骤 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 —————— 这个不错,很详细,推荐。