block总结

  • (存在栈中的block)和(函数)在运行完后就会销毁
  • 在ARC中block可以用strong或copy都行,MRC则需用copy修饰
  • block是一个数据类型, 多用于参数传递, 代替代理方法, (有多个参数需要传递或者多个代理方法需要实现还是推荐使用代理方法), 少用于当做返回值传递.
  • block是一个OC对象, 它的功能是保存代码片段, 预先准备好代码, 并在需要的时候执行.
  • 使用block代码块应注意内部循坏引用, 导致循环引用应在block定义前加上__weak声明:
__weak typeof(<#obj#>) weak<#name#> = <#name#>;

在Xcode里输入inlineblock可以快速补全block定义:

<#returnType#> (^<#blockName#>) (<#parameterTypes#>) = ^ (<#parameters#>){            <#statements#>        };

returnType : 返回值类型
blockName : block命名parameterTypes : 参数类型
parameters : 参数声明
block使用 <#returnType#> (^<#blockName#>) (<#parameterTypes#>);
如: @property (copy, nonatomic) void (^block)(int);
在Block中, 如果只使用全局或静态变量或不使用外部变量, 那么Block块的代码会存储在全局区;
如果使用了外部变量, 在ARC中, Block块的代码会存储在堆区; 在MRC中, Block快的代码会存储在栈区;


block默认情况下不能修改外部变量, 只能读取外部变量:

    在ARC中,  外部变量存在堆中, 这个变量在Block块内与在Block块外地址相同;                                           
             外部变量存在栈中, 这个变量会被copy到为Block代码块所分配的堆中; 

    在MRC中, 外部变量存在堆中, 这个变量在Block块内与Block块外相同;                                           
            外部变量存在栈中, 这个变量会被copy到为Block代码块所分配的栈中;                 

如果需要修改外部变量, 需要在外部变量前面声明 __block:

    在ARC中, 外部变量存在堆中, 这个变量在Block块内与Block块外地址相同;
            外部变量存在栈中, 这个变量会被转移到堆区, 不是复制, 是转移.

    在MRC中, 外部变量存在堆中, 这个变量在Block块内与Block块外地址相同;
            外部变量存在栈中, 这个变量在Block块内与Block块外地址相同;

ARC && 外部变量在堆中:

1.__weak修饰,不会强引用,但是有可能变量会提前释放,可以在block内部用__strong重新修饰(不会循环引用,且会在执行完block后自动释放).
且block内外不是同一个变量,只是指向的地址相同.

2.__strong是强引用(可以在block结束前置为nil来避免循环引用),且声明block后变量本身地址会变化,且block内外的是同一个变量,所以要注意带来的隐患
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 13,327评论 10 69
  • 1、block的特点: block是C语言; block是一种数据类型、可以当做参数,也可以用做返回值 block...
    一叶清帆m雪阅读 3,452评论 0 0
  • BLOCK block的描述: 他是类似函数指针的一个代码块的内联封装, 他可以将一个函数体作为对象传递 bloc...
    Chris脑阅读 2,507评论 0 0
  • 参考 Block编译代码解读:block没那么难(一、二、三)iOS进阶——iOS(Objective-C) 内存...
    啊哈呵阅读 4,225评论 0 3
  • 07-25星期一,7:49八通线 早起下雨,还不小,5:39才停。下的时候,坐在马桶上心里先是想着:回去接着睡,六...
    魏雨self阅读 1,150评论 0 0