//带有自动变量值的匿名函数

//block 与 C语言函数比只有两点不同,1.没有函数名。 2.带有“^”。

//类似于方法,如B中的值传给A中,在B中,一. 定义 ; 二. 实现。  在A中. 一. 调用。

一、Block是什么?

- 匿名函数

- 截获自动变量

二、Block语法。

---1.语法

1.   ^  参数列表 表达式

2.   ^ 参数列表 表达式

3.   ^ 表达式

4. 完整block详细图。

  1. (返回类型)(^block名称)(参数类型)=^(参数列表){代码实现};

--- 自动变量的截获取

int a = ;
const NSString *loves = @"val ================> %d\n";
void (^STR)(void) = ^{
NSLog(loves,a);
}; //调用
a = ;
loves = @"------------------I love You-----------------";
STR(); //实现

---2. __block 说明符

1.block对外部变量是只读的,要变成可读可写,就需要加上__block

2.将栈中的block复制到堆上一份,从而避免了循环引用这个情况

3.没有用__block 之前,自动变量的截获只能保存执行block语法瞬间的值。

4.block 转c++ clang -rewrite-objc 源代码文件名。

5. __block 可以指定任何类型的自动变量。

6.对于用__block修饰的外部变量引用,block是复制其引用地址来实现访问的。

注意:如果是全局变量的话,可以直接赋值,不用加__block ;

 NSInteger i = ;
void (^blk)() = ^{
//Variable is not assignable (missing __block type specifier),编译器报错,变量未加__block,不能给自动变量(外部变量/局部变量)赋值.
// i = 2;
};

可以在block内给自动变量赋值(外部变量/局部变量)。

--- 实现//改成这样

__block NSInteger let = ;
//调用
void (^labels)() = ^{
//Variable is not assignable (missing __block type specifier),编译器报错,变量未加__block,不能给自动变量(外部变量/局部变量)赋值.
let = ;
NSLog(@"let====》%ld",let);
};
//实现
labels();

---3. __weak 说明符

//这个例子就造成了循环引用,(1)self(强引用)block. (2) 在block中又调用self的方法,block(强引用)self.   这样的话就造成循环引用

//self 对block引用
self.block = ^{ [self layouts]; // 在block中又调用self的方法,这样就造成了循环引用。
}

三、Block的用途及注意事项。

- 作为函数参数

- 反向传值

- 循环引用

- Block的使用注意

  • block内部可以访问外部的变量,block默认是将其复制到其数据结构中来实现访问的。
  • 默认情况下,block内部不能修改外面的局部变量,因为通过block进行闭包的变量是const的。
  • 给局部变量加上__block关键字,这个局部变量就可以在block内部修改,block是复制其引用地址来实现访问的。

- Block作为属性应该用copy修饰

  1. 当用weak、assign修饰block属性时,block访问外部变量,此时block的类型是栈block。保存在栈中的block,当block所在函数\方法返回\结束,该block就会被销毁。在其他方法内部调用访问该block,就会引发野指针错误EXC_BAD_ACCESS
  2. 当用copy、strong修饰block属性时,block访问外部变量,此时block的类型是堆block。保存在堆中的block,当引用计数器为0时被销毁,该类型block是由栈类型的block从栈中复制到堆中形成的,因此可以在其他方法内部调用该block。在ARC下,strongcopy都可以用来修饰block,但是建议修饰block属性使用copy

四.所有栗子:

//(1)定义无参无返回值的Block

    void (^noneBack)() = ^(){

        NSLog(@"定义无参数无返回值的block");
};
noneBack();
//(2)定义有参数无返回值的Block
void (^oneBack)(NSString *str) = ^(NSString *strs){ NSLog(@"%@",strs);
};
oneBack(@"我是一个参数的block");
//(3)定义有参数int返回值的Block
int (^intBack)(int ,int) = ^(int a,int b){ return a+b;
};
int sum = intBack(,);
NSLog(@"a+b== %d",sum);

五.block在其它语言的说法

block的哪些事 --- 学习笔记十的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...

  3. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  4. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法

    python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...

  5. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  6. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  7. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  8. python3.4学习笔记(十) 常用操作符,条件分支和循环实例

    python3.4学习笔记(十) 常用操作符,条件分支和循环实例 #Pyhon常用操作符 c = d = 10 d /= 8 #3.x真正的除法 print(d) #1.25 c //= 8 #用两个 ...

  9. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

随机推荐

  1. ABP中使用Redis Cache(1)

    本文将讲解如何在ABP中使用Redis Cache以及使用过程中遇到的各种问题.下面就直接讲解使用步骤,Redis环境的搭建请直接网上搜索. 使用步骤: 一.ABP环境搭建 到http://www.a ...

  2. eclipse js 报错解决办法

    最近项目中的js一直红叉叉,本人本来就是那种看见回收站有东西想清理的那种强迫症患者, 所以对于这种红叉叉更是心烦.这个我已经忍了好久了.今天 见这哥们犀利的解决了这个eclipes的bug.很是激动, ...

  3. 事件流之事件冒泡与事件捕获<JavaScript高级程序设计>学习笔记

    1.事件流 浏览器开发团队遇到一个很有意思问题:页面的那一部分会拥有特定的事件? 对于理解这个问题您可以想象画在一张纸上的一组同心圆,如果你把手指放在圆心上,那么你的手指指向的其实不是一个圆,而是纸上 ...

  4. artTemplate模板引擎学习实战

    在我的一篇关于智能搜索框异步加载数据的文章中,有博友给我留言,认为我手写字符串拼接效率过低,容易出错.在经过一段时间的摸索和学习之后,发现现在拼接字符串的方法都不在是自己去书写了,而是使用Javasc ...

  5. 《javascript面向对象精要》读书笔记

    <javascript面向对象精要> 买这本书的原因主要是因为作者,Nicholas C. Zakas 牛X闪闪的js专家,读过js高程的应该都知道他,而这本书是他的最新力作,感觉也是js ...

  6. jQuery静态方法globalEval使用和源码分析

    Eval函数大家都很熟悉,但是globalEval方法却很少使用,大多数参考手册也没有相关api,下面就对其用法和源码相应介绍: jQuery.globalEval()函数用于全局性地执行一段Java ...

  7. UIPickerView的使用(三)

    前两篇文章 UIPickerView的使用(一) . UIPickerView的使用(二),学习了UIPickerView的单列选择器和双列选择器的使用. 现在我们一起学习相互依赖的多列选择器 1.遵 ...

  8. php 7.0 安装以及老版本php删除

    一, 安装php7 php7对php5是99%的兼容, 而且性能更好, 网上很多的优秀的库都对版本有一定的要求, 所以推荐安装php7 低于ubuntu 16.04的系统默认的源不带php7, 所以需 ...

  9. entity Framework codefirst Migrations

    一次数据迁移的记录 首先在vs工具里面使用打开程序包管理器控制台 在控制台上面选择程序集为数据访问层 注意配置生成app里面的连接字符串 在控制台输入 Enable-Migrations 会自动生成一 ...

  10. iOS APP上架过程常见问题

    1.生产证书失效 2.上图中的蓝色选中部分的Provising Profile文件页需要导入,(调试证书(Developer).发布证书(distribution).还有Provising Profi ...