OC基础(13)

内存管理简介

本小节知识点:

  1. 【了解】内存管理的重要性
  2. 【理解】什么是内存管理
  3. 【掌握】堆和栈

1.内存管理的重要性

  • 移动设备的内存极其有限,每个app所能占用的内存是有限制的

  • 下列行为都会增加一个app的内存占用

    • 创建一个OC对象
    • 定义一个变量
    • 调用一个函数或者方法
  • 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间。比如回收一些不需要使用的对象、变量等

  • 如果app占用内存过大, 系统可能会强制关闭app, 造成闪退现象, 影响用户体验


2.什么是内存管理

  • 如何回收那些不需要再使用的对象?

    • 那就得学会OC的内存管理
  • 所谓内存管理, 就是对内存进行管理, 涉及的操作有:

    • 分配内存 : 比如创建一个对象, 会增加内存占用
    • 清除内存 : 比如销毁一个对象, 能减小内存占用
  • 内存管理的管理范围

    • 任何继承了NSObject的对象
    • 对其他非对象类型无效(int、char、float、double、struct、enum等 )
  • 只有OC对象才需要进行内存管理的本质原因

    • OC对象存放于堆里面
    • 非OC对象一般放在栈里面(栈内存会被系统自动回收)

3.堆和栈

  • 栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(先进后出);

  • 堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。

  • 示例:


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        int a = 10; // 栈
        int b = 20; // 栈
        // p : 栈
        // Person对象(计数器==1) : 堆
        Person *p = [[Person alloc] init];
    }
    // 经过上一行代码后, 栈里面的变量a\b\c都会被回收
    // 但是堆里面的Person对象还会留在内存中,因为它是计数器依然是1
    return 0;
}

 

 

引用计数器

本小节知识点:

  1. 【理解】什么是引用计数器
  2. 【理解】引用计数器的作用
  3. 【理解】引用计数器的操作

1.什么是引用计数器

  • 系统是如何判断什么时候需要回收一个对象所占用的内存?

    • 根据对象的引用计数器
  • 什么是引用计数器

    • 每个OC对象都有自己的引用计数器
    • 它是一个整数
    • 从字面上, 可以理解为”对象被引用的次数”
    • 也可以理解为: 它表示有多少人正在用这个对象

2.引用计数器的作用

  • 简单来说, 可以理解为:

    • 引用计数器表示有多少人正在使用这个对象
  • 当没有任何人使用这个对象时, 系统才会回收这个对象, 也就是说

    • 当对象的引用计数器为0时,对象占用的内存就会被系统回收
    • 如果对象的计数器不为0,那么在整个程序运行过程,它占用的内存就不可能被回收(除非整个程序已经退出 )
  • 任何一个对象, 刚生下来的时候, 引用计数器都为1

    • 当使用alloc、new或者copy创建一个对象时,对象的引用计数器默认就是1

3.引用计数器的操作

  • 要想管理对象占用的内存, 就得学会操作对象的引用计数器

  • 引用计数器的常见操作

    • 给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回对象本身)
    • 给对象发送一条release消息, 可以使引用计数器值-1
    • 给对象发送retainCount消息, 可以获得当前的引用计数器值
  • 需要注意的是: release并不代表销毁\回收对象, 仅仅是计数器-1


 

dealloc方法

本小节知识点:

  1. 【掌握】dealloc方法基本概念

1.dealloc方法基本概念

  • 当一个对象的引用计数器值为0时,这个对象即将被销毁,其占用的内存被系统回收
  • 对象即将被销毁时系统会自动给对象发送一条dealloc消息 (因此, 从dealloc方法有没有被调用,就可以判断出对象是否被销毁)

  • dealloc方法的重写

    • 一般会重写dealloc方法,在这里释放相关资源,dealloc就是对象的遗言
    • 一旦重写了dealloc方法, 就必须调用[super dealloc],并且放在最后面调用
  • 使用注意

    • 不能直接调用dealloc方法
    • 一旦对象被回收了, 它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)

 

野指针\空指针

本小节知识点:

  1. 【掌握】什么是僵尸对象
  2. 【掌握】什么是野指针
  3. 【掌握】什么是空指针

1.僵尸对象

  • 已经被销毁的对象(不能再使用的对象)

2.野指针

  • 指向僵尸对象(不可用内存)的指针
  • 给野指针发消息会报EXCBADACCESS错误

3.空指针

  • 没有指向存储空间的指针(里面存的是nil, 也就是0)
  • 给空指针发消息是没有任何反应的

  • 为了避免野指针错误的常见办法

    • 在对象被销毁之后, 将指向对象的指针变为空指针

转载于:https://www.cnblogs.com/zhoudaquan/p/5016824.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值