内存管理

引用计数法:
持有时+1,释放时-1,当引用计数为0时,进行dealloc。

四法则:
- 自己生成对象,自己持有(alloc,copy….)
- 非自己生成对象也可以持有
- 自己不持有时,需要释放
- 非自己持有对象,无法释放

MRC ,ARC

MRC是我们自己手动添加retain,release。

ARC是编译器的特性,自动插入retain和release。


循环引用

MRC:

     assign,手动置nil。

ARC:

    __weak,当对象没有强引用时,自动置nil。

为什么weak会自动置nil?
weak会有一个weak表(散列表),对象地址作为键值,一个键值可以有多个对象地址。在对象引用计数为0 时,执行dealloc。
调用obj_clear_deallocing方法会从weak表中获取废弃对象地址的键值记录,将所有变量地址置为nil,然后从weak表中删除该记录。

   __weak typeof (self)
   @weakify , @strongify

Block中使用多层的话,需要加多个@strongify吗?

   需要,若是不加的话,使用的是上一层嵌套的strong类型的self,加上@strongify的话,就是指与@weakify对应的__strong类型的self__weak。

如果使用@weakify不使用@strongify的话,会出现什么问题?

   self被销毁时,会引起crash。

在MRC到ARC之间,使用__unsafe_unretained,当对象没有被强引用时,并不会置nil。(存在的原因就是没有出现weak,或者是C语言结构体中引用OC对象时)

我们常说的代理对象,需要使用weak修饰,原因是为何?造成循环引用,如何造成?

比如说TableView使用的代理,TableViewController持有的tableView,即self.tableview.delegate = self;
viewController(也就是self)持有tableviewtableview.delegate 又持有viewController(self).

Aoturelease
  1. 延迟释放对象
  2. 减少内存峰值

放入autoreleasepool中,在runloop结束时(例如一次事件的触发),将pool中的对象进行调用release方法。

AutoreleasePoolPage

固定大小:4096字节

出现AutoreleasePool循环嵌套的问题,如何体现是哪个AutoreleasePool的对象?

             会在AutoreleasePoolPage列表中嵌套一层,会加一个哨兵对象。

Toll-Free Bridging 桥接 CoreFoundation 与 Foundation之间的转换
  • _bridge 只是将声明类型转换,内存管理不变

  • _bridge_retained 常用在将OC对象转化成CF对象,且OC对象的所有权也交给CF对象来管理,即OC对象转化成CF对象 ARC->MRC

  • _bridge_transfer 常用在CF对象转化成OC对象时,将CF对象的所有权交给OC对象 MRC->ARC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值