项目如何判断是用MRC还是ARC呢?
如何让项目支持MRC或者支持ARC?
给文件添加flags -fobjc-arc 就能让原来的MRC支持ARC
如果要禁止ARC,则将flags 改为 -fno-objc-arc
MRC
创建对象的几种方式 alloc、new 、copy、mutableCopy,这四种方法创建的对象需要自己发送release消息手动释放。
要想持有一个对象就要调用retain方法。
方法的返回值,这种不知道什么时候该释放的对象需要调用autorelease方法,让自动释放池来管理对象的释放。
ARC
基本不需要关系对象的创建和释放,编译器会自动添加retain、release、autorelease方法。但有些对象也是需要做内存的管理的,例如CoreFoundation产生的对象。做pdf转图片保存到相册的时候遇到过的CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)[NSURL URLWithString:self.dataArr[_currentCount]]);
因为CGPDFDocumentCreateWithURL会retain创建的对象返回给pdf,而pdf又不是Objective-C对象,所以需要手动释放。CGPDFDocumentRelease(pdf);
,还有些内容
NSTimer CADisplayLink 这两个类在addTarget的时候会强引用target对象,很容易造成循环引用。
参考资料
http://www.lanrenios.com/tutorials/all/2012/1024/221.html
http://blog.csdn.net/wbw1985/article/details/7644815
ARC阅读资料
https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html
http://clang.llvm.org/docs/AutomaticReferenceCounting.html
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html#//apple_ref/doc/uid/10000011-SW1
http://clang.llvm.org/get_started.html
Clang 介绍
http://llvm.org/svn/llvm-project/cfe/trunk/
Runtime介绍
http://llvm.org/svn/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp
苹果开源代码 runtime库实现
https://opensource.apple.com/source/objc4/objc4-493.9/
runtime/objc-arr.mm ARC相关的API
runtime/objc-weak.mm __weak修饰符功能API
libobjc2 是 Objective-C运行时库的实现,该库通过GNUstep工程实现ARC
相当于苹果公司的Objective-C运行时库的实现 objc4
http://gnustep.blogspot.com/2011/07/gnustep-objective-c-runtime-15-released.html
http://thread.gmane.org/gmane.comp.lib.gnustep.general/36358
http://svn.gna.org/viewcvs/gnustep/libs/libobjc2/1.5/