对block的理解


    • Block是一种数据类型, C 语言的,匿名函数,可以被当做参数和返回值传递,
    • block是预先定义好的代码,可以在任何需要的时候被执行
    • .默认情况下,不允许在块代码内部修改外部变量的数值。
    • Block传值时要防止循环引用,例如:在一个 控制器中,self强指针指向一个对象,这个 对象又强指针指向一个block,在这个block的代码块中有一个self.,那么就会造成循环引用,从而导致内存无法释放,造成内存泄露。解决方法:只要打断其中一条 强引用,一般 在ARC情况下,通常用__weak修饰block中的self.,来打断强引用。例如:__weak typeof(self)weakSelf = self ,用weakSelf来指向self 的内存地址, 使得self 在block中使用时变成一个弱指针,打断循环引用。在MRC情况下,用__unsafe__unretained来打断强引用,但是__unsafe__unretained是“assign”形式,如果指向的对象被释放,其指针地址还是存在的保存不变,如果继续使用该指针,就会出现“野指针”现象。
    • Block内引用局部变量时在MRC下使用__block,ARC环境下要用__weak修饰此变量来解除循环引用。

  • block 的应用场景是什么?一般用于网络异步加载数据,通过block的参数进行回调数据
  • 定义block用copy修饰。
  • block的内存管理问题:block 是一个变量
  • ARC运行环境
        
    1> 全局block没有使用外部变量,block内部没有任何可变的因素的情况下,block保存在静态区。
        
    2> C语言malloc / free,保存在堆区(意思是:使用了外部变量,会保存在堆区)
  • MRC运行环境
        
    1.定义block:保存在栈区
        
    2.需要使用Block_copy,会把block复制到堆区
        
    3. block使用完成之后,需要使用Block_release释放block
        
    4.如果没有使用外部变量(极少极少……),同样保存在全局区
     
    栈区:主要存放局部变量,定义的参数等,在函数结束时,系统会自动回收它的内存空间,特点:方便快捷
     
    堆区:是由程序员自行管理的内存地址,程序结束时,如果内存地址没有释放完全,则由系统回收。特点:灵活 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值