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 ...
随机推荐
- Perfection Kills
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- ToStringBuilder 学习
一.简介与引入 1.ToStringBuilder.HashCodeBuilder.EqualsBuilder.ToStringStyle.ReflectionToStringBuilder.Co ...
- Spring 自动装配 Bean
Spring3系列8- Spring 自动装配 Bean 1. Auto-Wiring ‘no’ 2. Auto-Wiring ‘byName’ 3. Auto-Wiri ...
- 下载安装APK
protected void downloadApk() { //apk下载链接地址,放置apk的所在路径 //1,判断sd卡是否可用,是否挂在上 if(Environment.getExternal ...
- go语言中间的循环
在Go语言中只有很少的几个控制结构,它没有while或者do-while循环. 但是它有for.switch.if.而且switch接受像for那样可选的初始化语句.下面来认识一下他们 一.if语句 ...
- 详解zabbix安装部署(Server端篇)
原文:http://blog.chinaunix.net/uid-25266990-id-3380929.html Linux下常用的系统监控软件有Nagios.Cacti.Zabbix.Monit等 ...
- codeblock报__objc_class_name_xxx问题
添加来一个class文件,在其他文件调用时,报下面这个错误: undefined reference to `__objc_class_name_Test' 右击Test这个类的文件弹出Propert ...
- LINUX多线程(一)(创建和退出)
1. Linux多线程概述 1.1. 概述 进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段.这就造成进程在进行切换等操作时都需要有比较负责的上下文切换等动作.为了进一 ...
- grep的用法
grep的用法首先创建我们练习grep命令时需要用到的demo文件demo_file. $ cat demo_file THIS LINE IS THE 1ST UPPER CASE LINE IN ...
- linux 安装 easygui
如果遇到问题也查找不到资料时,可以认真阅读安装文件下的README说明,或许可以得到帮助. 本次环境为redhat 6.4.python2.7.9 linux 图形化显示需要安装一些依赖包,比如lib ...