【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方法,由网活动调用
    • 若是目标吃回收了,它占用的内存就不再可用,坚持利用会促成程序崩溃(野指针错误)

 

1.5 野指针与空指针:

僵尸对象:已经被灭绝的目标(不克以动用的靶子)

野指针

  • 指于僵尸对象(不可用内存)的指针
  • 让野指针发消息会报EXC_BAD_ACCESS错误

空指针:

  • 无针对性存储空间的指针(里面存的凡nil,也尽管是0)
  • 受空指针发消息是无任何影响的
  • 为了避免野指针错误的广泛方法。在靶被销毁后,将对对象的指针变为空指针。

    

只如一个目标为放走了,我们就是称此目标也”僵尸对象”

当一个指南针指向一个僵尸对象,我们便如此指针也野指针,只要被一个野指针发送信息就见面报错。

     图片 1

     图片 2

  监听”僵尸对象”的报错(方便调试,会在决定高出口错因):

     图片 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了

图片 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

 

相关文章