美文网首页
iOS面试题-内存管理的浅谈

iOS面试题-内存管理的浅谈

作者: ios_暗夜行者 | 来源:发表于2021-10-02 15:20 被阅读0次

    1.什么是 ARC?

    ARC 是 iOS 5 引入的内存管理新功能 -- 自动引用计数 。

    2.ARC的工作原理是什么?

    它的工作原理大致是这样:当我们编译源码时,编译器会分析源码中每个对象的生命周期,然后基于这些对象的生命周期,来添加相应的引用计数操作代码。所以,ARC 是工作在编译期的一种技术方案。

    3.ARC 的核心思想?

    自己生成的对象,自己持有

    非自己生成的对象,自己可以持有

    自己持有的对象不再需要时,需要对其进行释放

    非自己持有的对象无法释放

    4. ARC 在使用时应该遵循的原则?

    不能使用 retain、release、retainCount、autorelease。

    必须遵守内存管理方法的命名规则。

    不需要显示的调用 Dealloc。

    5.ARC 在编译时做了哪些工作?

    自动调用保留(retain)与释放(release)的方法。相对于垃圾回收这类内存管理方案,ARC 不会带来运行时的额外开销,所以对于应用的运行效率不会有影响。ARC会把能够互相抵消retain、release、autorelease,操作简化,如果发现在同一个对象上执行了多次保留与释放操作,那么ARC有时可以成对的移除这两个操作。

    6.简要阐述内存相关的关键字?

    Strong 修饰符表示指向并持有该对象,其修饰对象的引用计数会加1。该对象只要引用计数不为0就不会被销毁。当然可以通过将变量强制赋值 nil 来进行销毁。

    weak修饰符指向但是并不持有该对象,引用计数也不会加1。在Runtime中对该属性进行了相关操作,无需处理,可以自动销毁。weak用来修饰对象,多用于避免循环引用的地方。weak不可以修饰基本数据类型。

    assign主要用于修饰基本数据类型,例如NSInteger,CGFloat,存储在栈中,内存不用程序员管理。assign是可以修饰对象的,但是会出现问题。

    copy关键字和 strong类似,copy 多用于修饰有可变类型的不可变对象上 NSString,NSArray,NSDictionary上。

    7. 说一下什么是悬垂指针?什么是野指针?

    指针指向的内存已经被释放了,但是指针还存在,这就是一个 悬垂指针 或者说 迷途指针

    没有进行初始化的指针,其实都是 野指针

    8.如何打破循环引用?

    使用弱引用(__weak)。

    当实例变量完成工作后,将其置为 nil。

    9.能不能用 assign 修饰 Nsobject 类型?

    也可以,但有可能出问题。使用 assign 修饰 Nsobject 类型,赋值之后会被立即释放,对应的属性也就变成了野指针。运行时跑到属性有关操作会直接崩溃掉。

    10.内存中的5大区都是什么?

    栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。(特点:是一块连续的内存区域,遵循先进后出的原则 。优点:栈是由编译器分配和释放,不会产生内存碎片,快速高效。缺点:内存大小有限制)

    堆区(heap):是有程序员分配和释放,用于存放运行中被动态分配的内存段。大小不定,可增加和缩减。(特点:不连续的内存区域,遵循先进先出(FIFO)原则。优点:灵活方便,随取随用.缺点:需要手动管理,效率低,容易产生内存碎片。访问堆中的内存时,一般需要先通过对象读取到栈区的指针地址,然后通过指针地址访问堆区)

    全局区(静态区)(static):全局区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。static 修饰的变量始终保存到常量区。

    文字常量区:是编译时分配的内存空间,在程序结束后由系统释放。存放的是常量,是一块特殊的区域,常量字符串就是放在这里的。

    程序代码区:用来存放函数的二进制代码,它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,只允许读操作,不允许写操作.

    参考链接:https://www.jianshu.com/p/0d7dfb5093a8

    相关文章

      网友评论

          本文标题:iOS面试题-内存管理的浅谈

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