1.ARC是编译器的特性,不是java的自动回收
2.创建工程时,勾选Automic Reference Counting即可
3.使用ARC时,对象将不能调用releas,retain,retaincount方法
4.允许重写dealloc但不能[super dealloc]
1.只要没有强指针指向对象,该对象就会被销毁,释放对象,也就是说如果一开始只有弱指针指向对象,那么是无意义的,一开始就会被回收。
2.指针默认都是强指针,修饰符;__strong:连续两个下划线,相当于原来的retain,只适用于OC对象
3.弱指针:__weak,弱指针是没法决定对象的内存是否被回收,只有强指针可以决定。相当于原来的assign,只适用于OC对象
弱指针指向的对象如果被回收了,弱指针本身也会被自动置空,避免野指针问题
4.assign还是适用于基本数据类型
int main() { Person *p = [[Person alloc] init]; __weak Person *p2 = p; p=nil;//此时的Person对象已经被回收 p2=nil; return 0; }
1.ARC机制下的属性方法的写法
//Person.h文件写法 #import <Foundation/Foundation.h> @class Dog; @interface Person :NSObject @property(nonatomic,strong) Dog *dog; //不同的地方:声明是强指针的引用! @end
实例代码
int main() { Dog *d = [[Dog alloc] init]; Person *p = [[Person alloc] init]; p.dog = d; d = nil;//指向狗的指针为空,但是人的强指针还在指向狗,所以,这里的狗不会被回收!
p = nil;//指向人的指针为空,人对象被回收,对象的成员变量dog也被回收,此时没有指针指向狗,所以狗也被回收! return 0; }
@property(nonatomic,weak) Dog *dog; //弱引用那么,当
d = nil;时,唯一指向狗的强指针被回收,此时狗对象只有一个弱指针dog在指向着,但是弱指针不起作用,所以此时的狗已经被回收了。
strong可以保证:人在狗在!
weak会造成:人在狗不一定在!
点击XCode: edit -> refactor -> convert to oc ARC
点击项目 - buid settings, 搜索auto, 在编译器列表中,找OC ARC,看是不是yes
在buidphases中,点击.m文件,双击.m文件,弹出编写框,输入: -fno-obj-arc,表示当前这个.m文件不需要ARC功能。
输入-f-obj-arc,即可!