iOS 内存管理简述

作者: 恋空K | 来源:发表于2019-07-12 16:43 被阅读0次

    1.自动释放池

    什么是自动释放池?

    1 ). 当給一个对象发送autorelease消息时,方法会在未来某个时间給这个对象发送release消息将其释放,在这个时间段内,对象还是可以使用的。

    2 ). 对象接收到autorelease消息时,它会被添加到了当前的自动释放池中,当自动释放池被销毁时,会給池里所有的对象发送release消息。

    3 ). 自动释放池就是一个池,这个池可以容纳对象,而且可以自动释放,这就大大增加了我们处理对象的灵活性。

    Autorelease pool:

    自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放,自动释放池本身销毁的时候,池子里面所有的对象都会做一次release操作.

    autorelease:

    任何OC对象只要调用autorelease方法,就会把该对象放到离自己最近的自动释放池中(栈顶的释放池)

    iOS的内存管理一般指的是OC对象的内存管理,因为OC对象分配在堆内存,堆内存需要程序员自己去动态分配和回收;基础数据类型(非OC对象)则分配在栈内存中,超过作用域就会由系统检测回收

     __strong与变量

    在ARC模式下,id类型和OC对象的所有权修饰符默认是__strong。当一个变量通过__strong修饰符来修饰,当该变量超出其所在作用域后,该变量就会被废弃。同时,赋值给该变量的对象也会被释放。例如:

    {//变量p持有Person对象的强引用Person *p = [Person person];//__strong修饰符可以省略//Person __strong *p = [Person person];}//变量p超出作用域,释放对Person类对象的强引用//Person类对象持有者不存在,该对象被释放

    问题:僵尸对象、野指针、空指针分别指什么,有什么区别?

    僵尸对象:一个OC对象引用计数为0被释放后就变成僵尸对象了,僵尸对象的内存已经被系统回收,虽然可能该对象还存在,数据依然在内存中,但僵尸对象已经是不稳定对象了,不可以再访问或者使用,它的内存是随时可能被别的对象申请而占用的;

    野指针:野指针出现的原因是指针没有赋值,或者指针指向的对象已经被释放掉了,野指针指向一块随机的垃圾内存,向他们发送消息会报EXC_BAD_ACCESS错误导致程序崩溃;

    空指针:空指针不同于野指针,它是一个没有指向任何东西的指针,空指针是有效指针,值为nil、NULL、Nil或0等,给空指针发送消息不会报错,只是不响应消息而已,应该给野指针及时赋予零值变成有效的空指针,避免内存报错。

    自动释放池的释放操作指的是向池内所有的对象发送release消息,以让系统及时释放池内的所有对象。

    问题:

    如果一个对象释放前被加到了NotificationCenter中,不在NotificationCenter中remove这个对象可能会出现什么问题?

    首先对于NotificationCenter的使用,我们都知道,只要添加对象到消息中心进行通知注册,之后就一定要对其remove进行通知注销。将对象添加到消息中心后,消息中心只是保存该对象的地址,消息中心到时候会根据地址发送通知给该对象,但并没有取得该对象的强引用,对象的引用计数不会加1。如果对象释放后却没有从消息中心remove掉进行通知注销,也就是通知中心还保存着那个指针,而那个指针指的对象可能已经被释放销毁了,那个指针就成为一个野指针,当通知发生时,会向这个野指针发送消息导致程序崩溃。

    问题:什么是安全释放?

    释放掉不再使用的对象同时不会造成内存泄漏或指针悬挂问题称其为安全释放。

    浅拷贝和深拷贝

    既然讲到copy和mutableCopy,那就要谈一下深拷贝和浅拷贝的概念和实践。

    什么是浅拷贝、深拷贝?

    简单理解就是,浅拷贝是拷贝了指向对象的指针, 深拷贝不但拷贝了对象的指针,还在系统中再分配一块内存,存放拷贝对象的内容。

    浅拷贝:拷贝对象本身,返回一个对象,指向相同的内存地址。 深层复制:拷贝对象本身,返回一个对象,指向不同的内存地址。

    如何判断浅拷贝、深拷贝?

    深浅拷贝取决于拷贝后的对象的是不是和被拷贝对象的地址相同,如果不同,则产生了新的对象,则执行的是深拷贝,如果相同,则只是指针拷贝,相当于retain一次原对象, 执行的是浅拷贝。

    深拷贝和浅拷贝的判断要注意两点:

    源对象类型是否是可变的

    执行的拷贝是copy还是mutableCopy

    相关文章

      网友评论

        本文标题:iOS 内存管理简述

        本文链接:https://www.haomeiwen.com/subject/apcykctx.html