前言

大学时就已经接触过内存管理,不过和大多数同学一样,感觉没啥用啊,不知道用来干嘛,随着技术那么一丢丢的提升,越发的觉得内存管理的重要性,恰巧这次面试也碰到了,整理了下objective_c中常用的内存管理方式以及一点点自己的心得。

一点点基础

先说说程序运行时内存的分布情况吧:

  1. 栈:一般的局部变量,函数的行参都是存放在栈中,由操作系统来自动分配和销毁,效率比较高。
  2. 堆:运行时才能决定分配大小,由自己来分配和销毁,也是支撑起多态的根本。
  3. 代码区:由你编写的代码编译成二进制后存放的区域
  4. 常量区:就是常量呀
  5. 全局区:全局变量或者静态变量存放的区域

内存分配:

  • 静态存储区域分配,编译时已知分配大小
  • 在栈上创建 运行时已知分配大小
  • 从堆上分配 运行时还未知。

MRC,autoreleasepool,ARC

引用计数的内存管理思考方式:

  1. 自己生成的对象,自己持有
  2. 非自己生成的对象,自己也能持有
  3. 不再需要自己持有的对象,自己释放
  4. 非自己持有的对象无法释放

MRC:

分别对应了NSObject的alloc/retain/release/dealloc操作。

alloc 操作其实调用的是c语言中的calloc操作,在内存快中写入了retain count,并且内容指为nil。retain操作就是加入了异常处理的retaincount++,release操作就是retaincount—,而当retaincount为0的时候,自动调用了free操作,也就是dealloc。

autorelease:

可以这么理解,autorelease对象就像局部变量一样,在生命周期结束的时候自动释放,不过autorelease对象是可以设定作用域的。

autorelease对象其实就是调用了autoreleasePool对象的addObject方法。而autoreleasePool和局部变量一样在生命周期结束时自动调用drain方法,会release所有持有的对象。

ARC:

  • _strong来强引用对象,能够持有对象
  • _weak弱引用对象,不能持有,避免循环引用
  • _unsafe_unretain大多数情况和_weak一样,不过在对象释放时不会指向nil,造成悬空指针(不属于编译器的管理对象)
  • _autorelease一般不用,不显式注册也能起到作用,使用@autoreleasepool来代NSAutoreleasePool

深入内存机制

操作系统这本书上解释的很清楚了,其实我也不是很懂。。。就在这里说点闲话了

找工作,尤其是第一份工作需要慎重考虑,薪水不是关键,找准自己的方向,能够切合自己的兴趣更好。总是有舍有得,从今天开始,又是新的一天,

学习最可怕的不是你不努力,而是方向就错了,很庆幸能够找到一条属于自己的路,虽然未来会很坎坷。

(再也不想预测下一篇博客会写什么,貌似没有一次是准的)

留言

8月 16 2014