【Objective-C 篇】 ☞ 4. 内存管理

内存管理 : 

要害对堆内存举办保管,所谓的治本是指内存的分配(创立)和释放(回收)

内存管理:管理对象的分红和刑满释放,回收这多少个不须求再使用的目标(内存)

 

下列行为都会增多一个app的内存占用

  • 成立一个OC对象
  • 概念一个变量
  • 调用一个函数或者措施

一经app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验

1.1 二种管理方法

MRC(Manual Reference Counting):手动引用计数(手动管理内存)

装有目的的内存都急需大家手动管理, 必要程序员自己编写retain/release等代码

ARC(Automatic Reference Counting):自动引用计数(自动管理内存)

不须要程序员管理内存,编译器会在适当的地点自行给大家添加retain/release等代码

注意点: OC中的ARC和java中的垃圾回收机制不太一样,java中的垃圾回收是系统干得,而OC中的ARC是编译器干得

1.2 引用计数器(Reference
Counting)

  • 各种对象都有谈得来的引用计数器,引用计数器是用来计量对象被引述的次数。
  • 出殡信息时(alloc、copy、new),将引用计数器置为1。
  • OC语言使用对象的引用计数来保管内存。一个对象只要有另一个对象指向它,引用计数就得+1,当另一个目的不指向它时,引用计数就-1,当引用计数减成0时,表达这些目的已经没有人用了,系统会将对象的内存空间释放掉。

 

MRC是指目的的引用计数的加减操作手动进行,意思就是由程序员写代码来形成。

ARC是指目的的引用计数的加减操作自动举行,意思是说不需求程序员写代码,而是由编译器自动生成代码达成。

1.3 MRC下的引用计数器的操作

1)引用计数器加1(retain)

当你须要动用一个人家创设好的靶狗时,为了以防万一在使用此目的时期别人释放了这几个目的,我们要将此目标的引用计数器加1(程序员布告引用计数器),只要给目的发送retain音讯,引用计数器就会加1。

2)引用计数器减1(release)

  • 当你采纳的靶子不再行使时,发送release音讯
  • release音讯将目的的引用计数器减1
  • 假定引用计数器为0,则释放对象所占的储存空间。

3)dealloc与对象销毁

  • 当目的的引用计数器为0时,表达已经没有其余引用指向对象,对象就会被系统活动销毁。
  • 系统销毁对象以前,会活动向目的发送一条音讯”dealloc”新闻,对象所占的半空中就会被保释,千万不要自己去调用dealloc信息。
  • 可以动用“retainCount信息”,查看当期援引计数器的值。

NSLog(@“引用.retainCount = %ld”, 引用.retainCount); //打印引用计数器的值

1.4 dealloc方法

当一个对象的引用计数器值为0时(对象即将被销毁时),系统就会自行调用dealloc方法。

为此,从dealloc方法有没有被调用,就足以看清出目的是或不是被灭绝

貌似经过dealloc方法来监听一个目的有没有被放走,而不用retainCount方法(retainCount方法有时候不是很可相信)

 

  • dealloc方法的重写
    • 诚如会重写dealloc方法,在此处释放相关资源,dealloc就是目的的遗训
    • 一经重写了dealloc方法,就无法不要在终极面调用 [super dealloc] 
      (ARC下,不可能调用父类的法门dealloc)

 

  • 运用注意
    • 无法手动调用dealloc方法,由系统自动调用
    • 假定目标被回收了,它占用的内存就不再可用,锲而不舍利用会促成程序崩溃(野指针错误)

ACCESS, 

1.5 野指针与空指针:

僵尸对象:已经被灭绝的目的(无法在采纳的靶子)

野指针

  • 指向僵尸对象(不可用内存)的指针
  • 给野指针发音讯会报EXC_BAD_ACCESS错误

空指针:

  • 未曾针对存储空间的指针(里面存的是nil,也就是0)
  • 给空指针发音讯是绝非其余反馈的
  • 为了防止野指针错误的常见方法。在对象被销毁之后,将本着对象的指针变为空指针。

    

只要一个对象被保释了,我们就称这些目的为”僵尸对象”

当一个指针指向一个僵尸对象,大家就称这几个指针为野指针,只要给一个野指针发送音信就会报错。

     ACCESS 1

     ACCESS 2

  监听”僵尸对象”的报错(方便调试,会在控制台出口错因):

     ACCESS 3

注意:null.name和[null
run]; 不能够用null去拜谒属性和调用方法。尽管不会报错,可是怎么也不会生出。

OC是弱语英语言,有些错误编译不会报错!

 

1.6 内存管理条件

苹果官方规定的内存管理标准化:

  1. 何人创立哪个人release:

假使您通过alloc、new或copy来创立一个对象,那么你必须调用release或autorelease

  1. 谁retain谁release:

如若你调用了retain,就不可以不调用一回release

总结:

  • 有加就有减
  • 已经让对象的计数器+1,就非得在结尾让计数器-1

 

 

1.7 MRC项目与ARC项目里面的转换

创建的花色默许使用ARC。

  • ARC —> MRC:

若是要利用MRC,要么将某个要求利用MRC的.m文件设置成MRC,或将一切项目变成MRC。

1) 怎么着将单个.m文件设置成MRC/ARC:

在Xcode中当选项目-》Build Phases-》Compile Sources-》选中需要运用MRC的.m文件-》双击此文件。

在弹出地小窗口中输入以下内容:

-fno-objc-arc 
(设置MRC:表示文件不协助Objective-C的ARC)

-fobjc-arc  (设置ARC:表示文件匡助Objective-C的ARC)

2) 怎么样将全方位项目改成MRC:

在Xcode中当选项目==>Build Settings==>搜索”Automatic Reference ( ARC ) ”==>找到”Objective-C Automatic Reference
Counting”将其值”YES”改成NO. 意思是关闭ARC,此时项目就全是MRC了

ACCESS 4

  • MRC  —> ARC:

    Xcode菜单:Edit —>Convert —> To Objective-C ARC…

  

  怎样让代码既包容ARC又至极MRC?

//MRC时

#if(!__has_feature(objc_arc))

    //MRC下的执行代码

#endif

//ARC时

#if __has_feature(objc_arc)

    //ARC下的执行代码

#else

    //MRC下的执行代码

#endif

 

相关文章