Objective-C的内存管理

1、Objective-C内存管理的对象程序员

1. 值类型:好比int、float、struct等基本数据类型。算法

  • 值类型会被放入栈中,在内存中占有一块连续的内存空间,遵循先进后出的原则,故不会产生碎片。
  • 由系统分配管理

2. 引用类型:Objective-C的对象安全

  • 引用类型会被放到堆中,内存分配按照必定的分配算法,但不管算法多优,总会产生碎片。
  • 内存的分配和释放由程序员操做管理

3. 值类型和引用类型之间的相互转化多线程

  • 装箱:把值类型转化为引用类型的过程叫作装箱,如把int包装为NSNumber。
  • 拆箱:把引用类型转为值类型的过程叫作拆箱,如把NSNumer转为int。

2、Objective-C内存管理的对象的方法性能

1. 引用计数atom

  • 表示对象被引用的次数,经过它能够判断对象是否被回收。
  • 若是引用计数为0,对象回收,不为0则不回收。
  • 当对象执行alloc、new、copy或者retain时,引用计数加1,release时,引用计数减1。

3、Objective-C管理内存的方式线程

1. 手动内存管理机制:MRC设计

  • MRC模式下,全部的对象都须要手动的添加retain、release代码来管理内存。
  • 使用MRC,须要遵照谁建立,谁回收的原则。也就是谁alloc,谁release;谁retain,谁release。
  • 当引用计数为0的时候,必须回收,引用计数不为0,不能回收,若是引用计数为0,可是没有回收,会形成内存泄露。若是引用计数为0,继续释放,会形成野指针。为了不出现野指针,咱们在释放的时候,会先让指针置为nil。

2. 自动内存管理机制:ARC指针

1)ARC模式下的property变量修饰词对象

  • 强引用strong:至关于retain,使用以后,计数器值+1。
  • 弱引用weak:至关于assign,使用不会改变计数器的值,指针指向的地址被释放后,会自动置为nil。
  • retain:引用计数值+1,即对象持有者的个数+1。
  • assign:设置变量时使用,不设计引用计数。
  • copy:拷贝对象。
  • readwrite与readonly:限制访问者的权限。
  • atomic与nonatomic:原子操做与非原子操做。原子操做适用于多线程,对共享资源的安全访问。非原子操做多用于非多线程,能够提升性能。

 2)自动释放池

自动内存释放使用@autoreleasepool关键字声明一个代码块,若是一个对象在初始化时调用了autorelase方法,那么当代码块执行完以后,在块中调用过autorelease方法的对象都会自动调用一次release方法。这样一来就起到了自动释放的做用,同时对象的销毁过程也获得了延迟(统一调用release方法)。

  1. autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中; 
  2. 自动释放池实质是当自动释放池销毁后调用对象的release方法,不必定就能销毁对象(例如若是一个对象的引用计数器>1则此时就没法销毁); 
  3. 因为自动释放池最后统一销毁对象,所以若是一个操做比较占用内存(对象比较多或者对象占用资源比较多),最好不要放到自动释放池或者考虑放到多个自动释放池; 
  4. ObjC中类库中的静态方法通常都不须要手动释放,内部已经调用了autorelease方法;
相关文章
相关标签/搜索