iOS 基础 第四天(0809)

时间:2023-03-08 22:09:49
iOS 基础 第四天(0809)

0809 - 内存管理,只对oc对象生效. alloc、retain、release、retainCount

局部变量是放在栈里面的,oc对象是放在堆里面的。栈里面的内容系统自动回收,而堆里面的内容还在,所以不适用ARC的时候要手动回收这些对象内容

如下图所示:

iOS 基础 第四天(0809)


对象的基本结构
  • 每一个对象内部都有一个引用计数器,占用4个字节,是一个整数,当这个引用计数器的值为0的时候,这个对象就会被系统回收销毁.当一个对象刚刚诞生的时候,这个计数器的值为1

如下图所示:

iOS 基础 第四天(0809)


引用计数器的作用

如下图所示:

iOS 基础 第四天(0809)


引用计数器的操作

如下图所示:

iOS 基础 第四天(0809)


对象的销毁

如下图所示:

iOS 基础 第四天(0809)

野指针
  • 野指针:指向僵尸对象(不可用内存,这个内存已释放)的指针.例如:[p release]执行多次释放.可能会出错,前提是要打开Scheme下面的僵尸对象探测开关.

开关如下图:

iOS 基础 第四天(0809)

也指针现象如下图所示:

iOS 基础 第四天(0809)

具体错误现象如下图:

iOS 基础 第四天(0809)

为了防止野指针可以将指针指向nil p = nil;


一些内存的总结

如下图:

iOS 基础 第四天(0809)


有alloc就有release,有retain就有release

如果同时手动实现了一个成员变量的方法的话,这个成员变量的真实名称就不是name了。如果还是要使用name的话就要在@interface{}里面手动写上_name

如下图所示:

iOS 基础 第四天(0809)

iOS 基础 第四天(0809)

或者

iOS 基础 第四天(0809)


自动释放池 autoreleasepool 自动释放 autorelease
  • 自动释放池里的方法执行完毕后会自动调用一次释放池里对象的release方法
  • 自动释放池可以嵌套自动释放池
  • 自动释放池是放在栈中的
  • 自动释放池里的对象无法精确控制.只有自动释放池方法执行完成的时候才会调用所有对象的release方法,将对象的引用计数器-1,及时都-1了这个对象也不一定就能释放,这里需要看自己的内存控制方式.

自动释放池栈结构:

iOS 基础 第四天(0809)

自动释放池代码结构:

iOS 基础 第四天(0809)