iOS 内存管理详解

来源:互联网 发布:网络权限申请流程 编辑:程序博客网 时间:2024/04/27 22:01

在ARC下主要有以下几个关键字:
1.关键字 __strong 默认值,表示只要有强引用指针指向该变量,则该变量会一直存在。
2.关键字__weak 弱引用,表示若没有任何强引用指针指向该变量,会自动将变量的值置为空,即nil状态。
3.关键字 __autoreleasing 用于标示自动释放的变量
4.关键字__unsafe_unretained 不安全的弱引用,若没有任何强引用指针指向该变量,不会自动设为空,会成为野指针。

__strong强引用,是ARC中变量声明的默认值,如果是手动分配的堆内存,并且没有指针指向这块内存,那么这块内存就会被回收
1.当声明变量为强引用时,对象的指针出栈时,如果该指针指向的内存空间没有别的指针指向它,那么就会自动掉用dealloc方法释放堆内存
2.给对象指针重写分配内存的情况,如果没有别的指针指向该内存空间的话那么就会随着对象的指针出栈的时候,释放这块内存空间
3.把对象指针置为空时,分配的堆内存会立即被释放掉
4.把新的对象指针指向堆内存空间,然后把原有的指针进行置空此时这块内存空间不会被释放,因为有新的指针指向这块内存空间

__weak 归零弱引用:弱引用指针指向的内存被释放后,弱引用的指针则会置零
1.归零弱引用:弱引用的指针指向强引用的内存时,是不影响其释放内存空间的,当弱引用指针所指空间被释放的时候,该弱引用指针会被置零。

__autoreleasing 自动释放,一般结合@autoreleasepool(自动释放池)使用
1.自动释放修饰的指针所指向的内存空间会在自动释放池结束的时候会被释放
2.__autoreleasing结合着自动释放池会延迟内存空间的释放
//情况2.自动释放类型和自动释放池配合,延迟对象的释放

void autoReleaseTest2(){    @autoreleasepool {        __autoreleasing TestClass *obj;        {            obj = [TestClass new];            obj.name = @"obj";            obj = nil;            NSLog(@"把自动释放对象在自动释放池里置空,其所指内存空间是不会被释放的!");        }        NSLog(@"出上面的大括号,只要不出自动释放池是不释放所指内存空间的!");    }}

2014-08-13 20:06:45.890 ARCDemo[4448:303] 把自动释放对象在自动释放池里置空,其所指内存空间是不会被释放的!
2014-08-13 20:06:45.892 ARCDemo[4448:303] 出上面的大括号,只要不出自动释放池是不释放所指内存空间的!
2014-08-13 20:06:45.892 ARCDemo[4448:303] obj,对象被释放啦!
从上面可以看出即使把指向内存空间的自动释放类型的指针置空,其对应的内存空间不像强引用那样被直接释放掉,而是等到自动释放池结束后在释放,这就是延迟释放。

3.被自动释放类型的指针用过的内存空间,在自动释放池结束的时候一样会被释放掉。

//情况3:自动释放类型和自动释放池的配合,延迟对象释放有可能造成暂时性的内存泄露void autoReleaseTest3(){    @autoreleasepool {        __autoreleasing TestClass *obj;        {            obj = [TestClass new];            obj.name = @"firstObj";            NSLog(@"上面的内存空间会由于下面的操作造成暂时内存泄露");            obj = [TestClass new];            obj.name = @"secondObj";        }    }    NSLog(@"一块释放了两个,上面分配的内存空间被自动释放类型的变量用过,出自动释放池时就会被释放");}

2014-08-13 20:12:37.512 ARCDemo[4459:303] 上面的内存空间会由于下面的操作造成暂时内存泄露
2014-08-13 20:12:37.514 ARCDemo[4459:303] secondObj,对象被释放啦!
2014-08-13 20:12:37.514 ARCDemo[4459:303] firstObj,对象被释放啦!
2014-08-13 20:12:37.515 ARCDemo[4459:303] 一块释放了两个,上面分配的内存空间被自动释放类型的变量用过,出自动释放池时就会被释放
上面的代码可能会引起内存泄露,因为如果第一次分配空间的时候如果我们往对象里加入的是一个视频,那么在第二次给自动释放类型的指针分配内存的时候,前面的内存空间不会被释放掉,直到自动释放池结束后两个内存空间才会被释放掉。

strong, autoreleasing,weak混在一起的使用情况:
内存空间只要有autoreleasing或者strong的指针所持有,就不会被释
1.strong和autoreleasing的混用:
(1).strong类型的指针指向自动释放的空间(强引用指针释放的时候才会释放内存空间)
(2).自动释放类型的指针指向strong类型的指针所分配的空间的情况(出自动释放池的时候才会释放内存空间)
(3).strong 类型的指针会指向自动释放类型的空间内存,当strong指针被置空时该内存不会被释放(出自动释放池的时候才会释放内存空间)

2.弱类型和自动释放类型的混用
即使有弱引用类型的指针指向该内存空间在出自动释放池的时候,该内存空间也会被释放。弱引用的指针会被置零

0 0
原创粉丝点击