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
网友评论