最近网上浏览了一些关于Block的文章,自己进行一下消化吸收。

Void (^blockName)(parma)-> Block声明

Void (^) (parma){};  ->Block定义 可省略返回值  ^(parma){};

当Block作为参数传递时 ->  (Void (^)(parma))blockName

常用 -> typedef Void (^blockName)(parma);

关于Block一些底层原理。通过 clang -rewrite-objc main.m 命令将OC转换为C++后,了解到Block的一些运作原理。

1. Block分为3种状态   _NSConcreteGlobalBlock,_NSConcreteStackBlock,_NSConcreteMallocBlock,分别为全局的Block、栈上的Block、堆上的Block,ARC模式中,第二种会隐式的将栈上的block拷贝到堆上。

2.关于Block内部使用外部变量的问题。

2.1 局部变量(基础数据类型)类似于值传递,所以在Block内部不能对局部变量修改,类似于函数中的值传递。

局部变量(对象)从.cpp文件中可以看到,在block的结构体中,强引用了局部对象,相当于引用计数+1,所以局部变量不会被销毁。当使用这个局部变量的时候,类似于函数中的指针传递,此时可以通过指针改变局部变量的值。

局部变量被__block修饰的时候,会生成一个__Block_byref_parma_0的结构体。这时候局部变量在block内部改变的时候,相当于也是指针传递,所以外部的值也被修改。(用__block修饰的局部变量还会生成copy和dispose俩个函数,用于管理内存)

局部变量被static 修饰的时候,block结构体中会多出一个*parma的指针,所以在block内部修改被static修饰的局部变量的时候,传递的是指针,也可以影响外部的局部变量。

2.2 全局变量(基础数据类型) 可以进行修改。

实例变量 在Block内部引用实例变量(无论是否使用get方法),block底层会生成一个对该实例变量的一个强引用,如果该实例持有block,会造成循环引用。避免方法用__weak修饰使用的实例变量。

Block学习总结的更多相关文章

  1. iOS Block学习

    iOS4已经直接支持blocks,很有必要学习一下. 在ios中,将blocks当成对象来处理,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其 本身又 ...

  2. Block学习一门:基本使用,使用block包NSURLRequest异步请求

    首先,看一下下面的代码: void (^myFirstBlock)(int theOne,int theTwo) = ^(int theOne,int theTwo){ NSLog(@"== ...

  3. block学习二:使用Block替代回调

    使用Block替代回调,分为三步进行:

  4. 黑马程序员_ Objective-c 之block、protocol学习笔记

    一):block学习总结 block :用来保存一段代码. 1.block 特点:  1> Block封装了一段代码,可以在任何时候执行   2> Block可以作为函数或者函数的返回值, ...

  5. iOS 使用Block实现函数回调

    事实上.iOS中的Block就是C++中的函数指针,实现方式都是一样的,以下贴出一个简单的实践. 首先,创建一个回调的类 BlockStudy.h // // BlockStudy.h // Bloc ...

  6. Aspects 源码学习

    AOP 面向切面编程,在对于埋点.日志记录等操作来说是一个很好的解决方案.而 Aspects 是一个对于AOP编程的一个优雅的实现,也可以直接借助这个库来使用AOP思想.需要值得注意的是,Aspect ...

  7. 系列文章--Enterprise Library文章总结

    自Enterprise Library 1.1 推出以来,Terry写了一系列的关于Enterprise Library的文章,其中得到了很多朋友的支持,在这里一并表示感谢.为了方便大家的阅读,这里我 ...

  8. monkey测试===ios-monkey测试工具

    iOSmonkey测试工具: crashmonkey 特点: 支持**真机测试.模拟器测试** 支持收集**系统日志(Systemlog)**.**崩溃日志(Crashlog)**.***instru ...

  9. windows 通过cmd命令行管理防火墙

    (1)恢复初始防火墙设置 netsh advfirewall reset(2)关闭防火墙 netsh advfirewall set allprofiles state off(3)启用桌面防火墙 n ...

随机推荐

  1. too many open files(打开的文件过多)解决方法

    https://blog.csdn.net/roy_70/article/details/78423880 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.n ...

  2. CSS3 实现圆形、椭圆形、三角形等各种形状样式

    CSS3 圆形 #css3-circle{ width: 150px; height: 150px; border-radius: 50%; background-color: #232323;} C ...

  3. 使用maven-tomcat7-plugins时调试出现source not found解决

    直接看下面的步骤: 步骤1: 步骤2: 步骤3: 步骤4:

  4. 回顾ThreadLocal

    ThreadLocal作为解决特定场景下并发的一种方案,在Spring等框架及面试中经常会被问到,它是Java必须要掌握的基础知识之一. ThreadLocal类的作用是抽象线程内变量的抽象,这类对象 ...

  5. Synchronized 有几种用法?

    我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面.其实 Synchronized 可以用到更多的场合. 1.同步普通方法(锁实例对象) 这个也是我们用得最多 ...

  6. bootstrap 模态框事件

    事件 描述 实例 show.bs.modal 在调用 show 方法后触发. $('#identifier').on('show.bs.modal', function () { // 执行一些动作. ...

  7. Hbase 与Hive整合

    HBase与Hive的对比 25.1.Hive 25.1.1.数据仓库 Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询. 25.1.2. ...

  8. RGB格式图像转化为HSV格式

    注:在阴影检测算法中经常需要将RGB格式的图像转化为HSV格式,对于阴影区域而言,它的色度和饱和度相对于原图像而言变化不大,主要是亮度信息变化较大,,将RGB格式转化为HSV格式,就可以得到H.S.V ...

  9. super超类继承特点小结

    super超类继承特点小结: 1. super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,产生了一个super对象: 2. super类的初始化函 ...

  10. git clone git@github.com:xxx.git Permission denied (publickey) 问题解决办法

    From: https://www.cnblogs.com/restart/p/4633928.html 如果git无法通过普通的http去clone远程分支,可以选用ssh方式去连接.这时需要配置相 ...