2.iOS内存管理方式

iOS支持两种内存管理方式:ARCMRCARC是基于MRC自 iOS 5 引入的内存管理新功能 -- 自动引用计数

ARC工作原理

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

ARC核心思想
  • 自己生成的对象,自己持有
  • 非自己生成的对象,自己可以持有
  • 自己持有的对象不再需要时,需要对其进行释放
  • 非自己持有的对象无法释放
ARC在编译时做了哪些工作?
  • 自动调用保留(retain)释放(release) 的方法

  • ARC在编译期,会把能够互相抵消的retain、release、autorelease操作约简。如果发现在同一个对象上执行了多次"保留"与"释放"操作,那么ARC有时可以成对地移除这两个操作。

ARC 在运行时做了哪些工作?
  • 主要是指weak关键字。weak 修饰的变量能够在引用计数为 0时被自动设置成 nil,显然是有运行时逻辑在工作的。

  • 为了保证向后兼容性,ARC 在运行时检测到类函数中的 autorelease 后紧跟其后 retain,此时不直接调用对象的 autorelease 方法,而是改为调用 objc_autoreleaseReturnValue
    objc_autoreleaseReturnValue 会检视当前方法返回之后即将要执行的那段代码,若那段代码要在返回对象上执行 retain 操作,则设置全局数据结构中的一个标志位,而不执行 autorelease 操作,与之相似,如果方法返回了一个自动释放的对象,而调用方法的代码要保留此对象,那么此时不直接执行 retain ,而是改为执行 objc_retainAoutoreleasedReturnValue 函数。此函数要检测刚才提到的标志位,若已经置位,则不执行 retain 操作,设置并检测标志位,要比调用 autoreleaseretain 更快。

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

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

能不能用 assign 修饰 Nsobject 类型?

首先我们需要明确,对象的内存一般被分配到堆上,基本数据类型和OC数据类型一般被分配在栈上。

如果用 assign 修饰对象,当对象释放后(因为不存在强引用,离开作用域对象内存可能被回收),指针的地址还是存在的,也就是说指针并没有被置为 nil ,下次再访问该对象就会造成野指针异常。对象是分配在堆上的,堆上的内存由程序员手动释放。

assign 修饰基本数据类型或OC数据类型,因为基本数据类型是分配在栈上的,由系统分配和释放,所以不会造成野指针。

你可能感兴趣的:(2.iOS内存管理方式)