block的哪些事 --- 学习笔记十
//带有自动变量值的匿名函数
//block 与 C语言函数比只有两点不同,1.没有函数名。 2.带有“^”。
//类似于方法,如B中的值传给A中,在B中,一. 定义 ; 二. 实现。 在A中. 一. 调用。
一、Block是什么?
- 匿名函数
- 截获自动变量
二、Block语法。
---1.语法
1. ^ 参数列表 表达式
2. ^ 参数列表 表达式
3. ^ 表达式
4. 完整block详细图。
(返回类型)(^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修饰
- 当用weak、assign修饰block属性时,block访问外部变量,此时block的类型是栈block。保存在栈中的block,当block所在函数\方法返回\结束,该block就会被销毁。在其他方法内部调用访问该block,就会引发野指针错误
EXC_BAD_ACCESS
。 - 当用copy、strong修饰block属性时,block访问外部变量,此时block的类型是堆block。保存在堆中的block,当引用计数器为0时被销毁,该类型block是由栈类型的block从栈中复制到堆中形成的,因此可以在其他方法内部调用该block。在ARC下,
strong
和copy
都可以用来修饰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的哪些事 --- 学习笔记十的更多相关文章
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...
- python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法
python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- python3.4学习笔记(十) 常用操作符,条件分支和循环实例
python3.4学习笔记(十) 常用操作符,条件分支和循环实例 #Pyhon常用操作符 c = d = 10 d /= 8 #3.x真正的除法 print(d) #1.25 c //= 8 #用两个 ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
随机推荐
- 个人项目框架搭建 -- Autofac简单使用记录
1.添加autofac相关程序集/使用Nuget 2.引入命名空间 using Autofac; using Autofac.Configuration; 3.使用 3.1:直接使用 var buil ...
- php实现设计模式之 迭代器模式
<?php /*迭代器模式: 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.(行为模式) * 1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的 ...
- .net 实体类与json转换(.net自带类库实现)更新
上一篇文章中写到在.net中实体类跟json格式的相互转换,今天在做具体转换时候,发现之前版本的jsonhelp对于日期类型的转换不全面.之前版本的jsonhelp中从实体类转换成json格式时候,将 ...
- 几款开源的hybird移动app框架分析
几款开源的Hybrid移动app框架分析 Ionic Onsen UI 与 ionic 相比 jQuery Mobile Mobile Angular UI 结论 很多移动开发者喜欢使用原生代码开发, ...
- .NET 各种框架
基于.NET平台常用的框架整理 分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架. Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度 ...
- #8.31课堂总结#JS基础
一.Javascript能做些什么? 表单数据合法性验证 网页特效:使用DOM和CSS可以实现网页特效 交互式菜单:创作具有动态效果的交互式菜单,完全能够与flash制作的导航菜单相媲美 动态页面:使 ...
- ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579
给esri中国的客服打电话被告知,是一直存在这个bug,arcgis10.2对应的oracle数据库版本要用11.2.0.3及以上的: 1.数据库升级可以用打补丁的当方式. 2.直接重装,我这里是直接 ...
- MyEclipse使用心得:SVN插件安装方法
1.在线安装,打开myeclipse,help--->MyEclipse Configuration Center 2.点击Add Site 打开对话框,在对话框Name输入Svn,URL中输入 ...
- Intent(二)隐式调用intent
在上一节我们一起学习了显示调用Intent,这一节我们来学习如何隐式调用Ingtent.有了这个我们就可以调用其他的线程,或者程序,可以让我们的应用程序变得多彩,如打开网页,拨打电话等. 接下来让我们 ...
- openfire安装
服务器第一次能够开启,但不久就断开,再连接就会闪退,命令行更改Java路径后即可 http://www.jianshu.com/p/5d88fe201c71 开启服务器后,导入数据库脚本,创建几个测试 ...