autorelease
基本使用
autorelease方法会放回对象本身。这句话先记住
autorelease就是将我们的所有的对象放到一个自动释放池中
当我们的自动释放池杀之前,他会做一个操作就是对我们自动释放池里面的所有对象做一次release操作
而我们如何使用我们的自动释放池呢?
就是我们在创建对象的时候,我们应该这样创建
有没有注意到我们的Xcode一旦创建了一个新的项目的时候,我们的main函数里面就会有这样的一段代码:
注意这里面的有一个autoreleasepool这个就是我们的自动释放池他的作用就如上面讲的所以要想我们的对象能够不必我们操心(有我们的自动释放池)帮助我们给我们的对象做最后一次的release操作就需要我们将我们的对象创建代码写在我们的autoreleasepool里面去所以我们的代码格式就如下:
使用注意:
1、自动释放池可以创建出无限多个,而且可以嵌套
2、我们调用autorelease方法时,并不会是我们的对象计数器减1,只有当我们的释放池被销毁之前,才会减1。
3、我们的释放池被放在一个数据处理的栈中(这个栈与先前说的栈有所不同)越是放进去的晚,越是先被释放
4、缺点:不能精确的控制对象被释放的时间
5、适用对象:占用内存很小的对象(意思就是我们以后除了一些小的对象其他的都不要放进释放池)至于对象占用内存大小我们以后会分析
总结:
内存管理总结:
ARC
基本原理
ARC是我们编译器的特性
1、当我们的程序在编译的过程中,我们的编译器会自动检测我们的代码中哪里需要插入我们的释放内存的代码
2、一旦我们使用我们的ARC之前写的大部分代码Xcode都不允许我们去写
3、而我们的ARC在释放我们的对象的时候也是需要一定的判断依据的(哪一个对象需要被释放、哪一个对象现在还不能被释放)而这个依据与我们的指针强弱有关
至于什么是强指针,什么是弱指针后面我们再讲。
4、一旦发现我们的对象是被弱指针指向的时候我们的编译器就会将我们的对象销毁
@property的strong与weak
之前我们在使用@property的时候一般会这么写
@property(nonatomic, retain)Dog *dog;
现在我们使用ARC之后我们要这样写;
@property(nonatomic, strong)Dog *dog;
在我们的代码中必须写上strong 因为写与不写却别很大
例如我们的人与狗的关系
如果我们想要人在狗就在,人亡狗就灭,的话我们就使用强指针
如果我们想要人亡,狗不一定灭的话,就使用弱指针
循环引用
以前我们说过的当两个对象相互引用 的时候,一般我们会一个用retain一个用assign
在我们ARC里面我们对于这样的循环引用我们会选择一个用strong一个用weak