美文网首页
iOS备忘录

iOS备忘录

作者: 扯淡的青春_ | 来源:发表于2018-07-22 22:10 被阅读0次

    内存的几大区域

    1.栈区 局部变量和实参
    2. OC中用new,alloc 方法创建的对象
    3.BSS段 没有初始化的全局变量和静态变量
    4.常量区/数据段 用来存储已经初始化的全局变量、静态变量、常亮数据
    5.代码段 代码的二进制文件

    OC内存堆栈

    • 概念
      a. 栈区(stack):由编译器自动分配释放,存放函数的参数值、局部变量等值。其操作方式类似于数据结构中的栈。
      b.堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。堆为链表结构。
    • 回收方式
      a.栈:系统分配自动回收,生命周期只是在函数运行过程中,运行后就释放,不可以在访问。
      b.堆:程序员根据需要自己申请的空间,不手动释放,就一直可以访问到。
    • 申请后系统的响应
      a.栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
      b.堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆,然后将该节点的空间分配给程序。

    内存泄漏话术

    内存泄漏:程序结束了,对象内存没有释放
    僵尸对象:已经被释放,空间已经释放的对象
    野指针:指向僵尸对象的指针
    空指针:指向nil的指针,给空指针发送消息(调用方法)不会报任何错误

    static

    所有未加static前缀的全局变量函数都具有全局可见性,其他的源文件也能访问。如果加了static,就会对其他源文件隐藏。
    利用这一特性可以在不同的文件中定义同名函数同名变量,而不必担心命名冲突。

    • 对于函数来讲,static的作用仅限于隐藏。
    • 对于变量,static还有以下作用:
      1.控制变量的可见范围
      2.保持变量内容的持久,存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量static变量
      3.默认初始化为0

    互斥锁与自旋锁

    • 互斥锁
      如果共享数据已经有其他线程加锁了,线程会进入休眠状态等待锁。一旦被访问的资源被解锁,则等待资源的线程会被唤醒
    • 自旋锁
      如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。

    结论:自旋锁效率会比较高,但是消耗的CPU资源会更多,所以我们一般耗时的操作都会选择互斥锁,这样就不会占用过多的CPU资源。

    持续更新中....

    相关文章

      网友评论

          本文标题:iOS备忘录

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