Objective-C:Block
Block是OC中一种与其它语言的语法区别较大的一种用法,需要注意:
- Block也叫代码段,它封装了一段代码,可以在任何时候执行;
- Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值;
- 它和传统的函数指针很类似,但也有区别:block是inline(内联函数)的,并且默认情况下它对局部变量时只读的;
- Apple建议尽量多使用block;
- 在多线程、异步任务、集合遍历、集合排序、动画转场中用的较多。
Block有两种使用方法:
1.直接定义一个block
// 定义了一个block,这个block返回值是int类型,接收两个int类型的参数
int (^Sum) (int, int) = ^(int a, int b) {
return a + b;
};
//调用block
int a = Sum( ,); NSLog(@"%i", a);
2.先用typedef定义block类型,再用该block类型定义具体的block
typedef int (^Oper) (int, int); int main(int argc, const char * argv[])
{
@autoreleasepool {
//声明了一个block变量,做加法功能
Oper add = ^(int a, int b) {
return a + b;
};
NSLog(@"%i", add(, )); //声明了一个block变量,做减法功能
Oper sub = ^(int a, int b) {
return a - b;
}
NSLog(@"%i", sub(, )); }
return ;
}
这样使用更具灵活性,可以定义一类操作类型,再利用这种操作类型定义具体的操作,比如我还可以继续定义乘法和除法的block。
Block可以访问局部变量,但是不能改变它,如果需要修改,需用__block作特殊声明:
// __block有2个下划线
__block int c = ;
// 声明了一个block变量
Oper add = ^(int a, int b) {
// 如果外部的变量用了__block关键字,就可以在block内部修改这个变量
c = ;//如果不加__block声明,这句会报错,只能打印c的值
// block可以访问外面定义的变量
NSLog(@"c is %i", c);
return a + b;
};
Objective-C:Block的更多相关文章
- block没那么难(二):block和变量的内存管理
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着 ...
- block没那么难(一):block的实现
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> block 顾名思义就是代码块,将 ...
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值) 使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: ...
- Block高级用法:Block传值UI_12(3)
1.简单复习Block的定义.赋值.调用做学习传值铺垫: //声明一个函数 无返无参void printfHello(int a);//函数的实现void printfHello(int a){ ...
- 环境变量、block、修饰符:block对环境变量的引用和修改需要通过修饰符来限定
环境变量.block.修饰符:block对环境变量的引用和修改需要通过修饰符来限定. http://www.cnblogs.com/fengmin/p/5816580.html - (NSUInteg ...
- <div>里用display:block有用么?
对所有的块元素都没有意义,块元素的dispaly属性默认值为block,没必要再显式定义--除非你之前对块元素的display属性重新定义过. =========================== ...
- display:block什么时候使用
所有的块级元素不需要再在使用display:block定义,块级元素本身的默认属性就是block display:block:比较常用于<a><span>这两个标签,因为他们不 ...
- display:block inline-block inlined的区别
一.首先要了解什么是块级元素与行级元素 块级元素 会占领页面的一行,其后多个block元素自动换行. 可以设置width,height,设置了width后同样也占领一行.同样也可以设置 margi ...
- CSS基础:block,inline和inline-block
css的display属性是前端开发中非常常见的属性,本文简单介绍下其中比较常用的属性值,即block.inline和inline-block. HTML组件中呈现一片空白区域的组件都可当盒模型(bo ...
随机推荐
- 常用CMD命令
查看电脑最大支持多大的内存: wmic memphysical get maxcapacity 查询DNS: nslookup a.root-servers.net 路由线路: ...
- JAVA操作数组
使用 Arrays 类操作 Java 中的数组 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等 ...
- const变量赋值报错分析
const变量赋值报错分析 const变量赋值报错 从变量到常量的赋值是合法C++的语法约定的, 如从char 到const char顺畅: 但从char **到 const char **编译器就会 ...
- implement Cartographer ROS for TurtleBots
github source: https://github.com/googlecartographer/cartographer_turtlebot 1. Building & Instal ...
- STORM_0004_windows下zookeeper的伪集群的搭建
-----------------------------------------------------START------------------------------------------ ...
- bzoj 1054: [HAOI2008]移动玩具 bfs
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 在 ...
- MVC3远程验证
public class StudentModel { [Display(Name="学生编号")] public int StuId { set; get; } [Require ...
- jQuery.validate.js+API_cn
名称 返回类型 描述 validate(options) 返回:Validator 验证所选的FORM valid() 返回:Boolean 检查是否验证通过 rules() 返回:Options ...
- 一个不错的能将HTML表格导出为excel,pdf等的jquery插件
https://github.com/kayalshri/tableExport.jquery.plugin https://github.com/kayalshri/ tableExport.jqu ...
- hibernate对象关系实现(二)一对一
双向一对一以部门和经理为例: a.部门和经理类中各自由对方的引用:(省略了get/set方法) b.数据库两种方式实现:一种(b.1)是外键映射,并将外键添加唯一约束(至于哪个对象的主键做外键,可随意 ...