黑马程序员——Objective--C笔记之ARC 和 autorelease

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一.autorelease自动释放池

1.自动释放池:特殊的栈结构

2.特点:对象可以加入到自动释放池中

              自动释放池结束的时候,会给池中的对象发送一条release消息

3.自动释放池的使用

1).创建自动释放池

@autoreleasepool{


2).加入到自动释放池

[对象 autorelease];

4.autorelease使用注意:

1).并不是所有防盗自动释放池中的代码,产生的对象就会自动释放,如果想要释放就必须加入到自动释放池中

2).要在自动释放池代码块中调用autorelease,就可以把对象加入到自动释放池中

例:Person  *p=[ [Person  new] autorelease];

5.autorelease 嵌套

自动释放池的栈结构(数据结构)和内存的栈区是不一样的,对象位于栈顶位置的自动释放池中

6.autorelease应用场景:经常用来在类方法中快速创建一个对象

例:返回的时候对象的空间能够帮我们把对象给加入到自动释放池

此处self指代的是方法的调用者[Person person]; self--->Person如果[Student person] 此处 self --->Student 

Person.h

+(instancetype)person{

          return [ [ [self  alloc] init] autorelease];

}

在自动释放池中使用类方法快速创建对象

main.m

Person *p=[Person  person];

Student *s=[Student  person];

二.ARC

1.指针分类

1).强指针:默认的情况下,所有的指针都是强指针,关键字strong

2).弱指针:_ _weak关键字修饰的指针

例:_ _weak Person *p;

2.ARC:Automatic Reference Counting,自动引用计数,即ARC 

3.ARC原则:不用写retain,release和autorelease三个关键字

4.ARC的判断准则:只要没有强指针指向对象,对象就会被释放,只要某个对象被任一strong指针指向,那么它将不会被销毁 ,注意当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了。 

5.ARC下单对象内存管理 

黑马程序员——Objective--C笔记之ARC 和 autorelease_第1张图片

d1是一个若指针,所以当空间释放后,d1也被设置为了nil,所以此时再次使用d1即便是开启了僵尸对象检测,也不会报错的。 

6.ARC下多对象内存管理 

黑马程序员——Objective--C笔记之ARC 和 autorelease_第2张图片

如图人拥有一条狗,所以人指向了狗,当人释放之后,狗也会释放掉

7.ARC下循环引入问题 

黑马程序员——Objective--C笔记之ARC 和 autorelease_第3张图片


如果两个对象互相拥有的话,也就是互相指向,都不能释放,导致内存泄漏,循环引入的对象中其中一个对象设置为strong 另一个设置为weak ,两个对象都可以释放掉

8.ARC特点总结

1).不允许调用release,retain,retainCount

2).允许重写dealloc,但是不允许调用[super dealloc]

3).@property的参数:

      strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针

      weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针

      assign:适用于非OC对象类型(基础类型)

9.ARC使用注意事项

1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作

2)__weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针设置为nil

3)ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]@property(nonatomic,strong)Dog *dog;
意味着生成的成员变量_dog是一个强指针,相当于以前的retain。

4)如果换成是弱指针,则换成weak,不需要加_ _。 

10.ARC模式下如何兼容非ARC的类 

黑马程序员——Objective--C笔记之ARC 和 autorelease_第4张图片




 






你可能感兴趣的:(黑马程序员——Objective--C笔记之ARC 和 autorelease)