《Object-C编程全解》笔记二:基于引用计数的内存管理

第五章 基于引用计数的内存管理

  1. 内存泄漏:程序未能释放已经不再使用的内存叫做内存泄漏。在指针所指向的对象已经被释放的情况下,该指针称为悬垂指针或野指针;
  2. 引用计数:内存管理有引用计数内存管理和垃圾回收机制内存管理两种,iOS只能使用引用计数内存管理,分为手动引用计数和自动引用计数,自动引用计数使开发者不需要考虑何时该使用retain、release、autorelease来管理内存,它自动提供了评估对象生存期的功能,在编译期间会自动加入何时的管理内存的方法;
  3. MRC:对象收到一个retain消息时,引用计数加1,收到一个release时,引用计数减1,当对象的引用计数为0时,对象则调用dealloc方法来释放内存;在重写dealloc方法时,在释放自身之前,需要通过使用release方法放弃自身的实例变量的所有权,销毁对象的时候,不允许直接调用dealloc方法,而是使用release;
  4. 自动释放:把所有需要发送releas消息的对象记录到自动释放池中(即向需要释放的对象发送autorelease消息),将其标记为以后释放,此时该对象的引用计数没有变化,还能继续使用,但是和release一样宣布放弃了对象的所有权,当自动释放池销毁时,池记录的所有对象就会被发送release消息;被发送了autorelease消息的对象叫做临时对象,在类构造方法中,生成的初始化对象一般为临时对象;
  5. ARC是一种编译期技术,通过在编译期间添加合适的retain、release、autorelease等函数,来确保对象被正确的释放;采用引用计数(ARC和MRC)管理内存时,如果不使用alloc/init/new/copy/mutableCopy这些类族方法或者retain来保存一个对象,就不能成为对象的所有者,另外,只有使用release或者autorelease才能放弃这个对象的所有权;
  6. 循环引用和弱引用:两个对象的实例变量互相引用对方,就会形参循环引用,导致内存泄漏;可以通过把某个对象的实例变量设置为nil来打破循环引用,或者通过弱引用来设置对象的实例变量,这样的弱引用变量只是指向对象而不持有对象的所有权,所以可以防止循环引用;
  7. 生命修饰符:__strong/__weak(自动nil化)/__autorelease(不自动nil化)/__unsafe_unretained(不自动nil化),后面三者都是指向对象而不持有对象所有权;
  8. 使用ARC时,结构体中不可以定义OC对象,因为编译期不能自动释放结构体;但是可以使用__unsafe_unretained来修饰OC对象变量,这样一来编译器就不会管理这个变量的内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值