oc基础入门之ARC基本原理

一.基本概念

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在指向着,但是弱指针不起作用,所以此时的狗已经被回收了。
同时,dog指针被自动回收

总结:

strong可以保证:人在狗在!

weak会造成:人在狗不一定在!

四 把手动代码管理的旧工程,自动转换为ARC下的工程代码

点击XCode:   edit -> refactor -> convert to oc ARC


五判断当前项目是否是ARC

点击项目 -  buid settings, 搜索auto,   在编译器列表中,找OC ARC,看是不是yes


六 让项目中即存在ARC代码,又存在非ARC代码

在buidphases中,点击.m文件,双击.m文件,弹出编写框,输入: -fno-obj-arc,表示当前这个.m文件不需要ARC功能。


七 项目本身就不是ARC,只想让部分.m支持ARC

输入-f-obj-arc,即可!


八,使用arc的情况下,还是无法避免循环引用导致的互相持有引用,一起无法被释放的情况,此时的解决方案是:一方用strong,一方用weak


你可能感兴趣的:(oc基础入门之ARC基本原理)