注意:在Xcode中关闭ARC方法:项目属性-Build Settings-搜索“garbage”找到Objective-C Automatic Reference Counting设置为NO即可
1、在Objc中内存的管理是依赖对象引用计数来进行的:在OC中每个对象内部都有一个与之对应的整数(retaincount),叫“引用计数器”,当一个对象在创建之后它的引用计数器为1,当调用这个对象的alloc,retain,new,copy方法之后引用计数器自动在原来的基础上加1(OC中调用一个对象的方法就是给这个对象发送一个消息),当调用这个对象的release方法之后它的引用计数减1,如果一个对象引用计数为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。
2、可以通过dealloc方法来查看是否一个对象已经被回收,如果没有被回收则有可能造成内存泄漏。如果一个对象被释放之后,那么最后引用它的变量我们手动设置为nil,否则可能造成野指针错误,而且需要注意OC中给空对象发送消息是不会引起错误的。
3、OC内存管理机制要遵循谁创建,谁释放的原则
4、参数类别:原子性:atomic,作用是对属性加锁,多线程下线程安全,如果不设置,则是默认值;nonatomic,作用是对属性不加锁,多线程下不安全,但是速度快。
读写属性:readwrite,生成getter、setter,默认值;readonly,只生成getter方法;
setter方法的处理:assign,直接赋值,默认值;retain,先release原来的值,再retain新值;copy,先release原来的值,在copy新值
5、一般情况下如果在多线程开发中一个属性可能会被两个及两个以上的现成同时访问,此时可以考虑atomic属性,否则建议使用nonatomic,不加锁,效率较高;readwrite方法会生成getter,setter两个方法,如果使用readonly则只生成getter方法;assign,用于基本数据类型,retain通常用于非字符串对象;copy,通常用于字符串对象、block。
6、半自动机制,有些操作需要手动设置。自动内存释放使用@autoreleasepool关键字声明一个代码块,如果一个对象在初始化时调用了autorelease方法对象,那么当代码块执行完之后,在块中调用过autorelease方法的对象都会自动调用一次release方法。这样一来就起到了自动释放的作用,同时对象的销毁过程也得到了延迟。
7、自动释放内存的总结:(1)autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中;(2)自动释放池实质就是当自动释放池销毁后调用对象的release方法,比一定就能销毁对象(如果一个对象的引用计数>1,则此时就无法销毁);(3)由于自动释放池最后统一销毁对象,因此如果一个操作比较占用内存(对象比较多或者对象占用资源比较多),最好不要放到自动释放池或者考虑放到多个自动释放池;(4)OC类库中得静态方法一般都不需要手动释放,内部已经调用了autorelease方法;
8、Xcode项目中我们可以使用ARC和非ARC的混合模式。如果你的项目使用的非ARC模式,则为ARC模式的代码文件加入-fobjc-arc标签。如果你的项目使用的是ARC模式,则为ARC模式的代码文件加入-fno-objc-arc标签
9、ARC如果对象被分配内存并处于一个方法当中,它会在这个方法的结尾处获得一个release语句。如果是一个类属性,它的release语句会加入到累的dealloc方法中。如果这个对象是用来返回的或者它是一个容器对象,它会加入一个autorelease语句。有如果这个对象是弱引用,把它放在一边不管它