OC学习4——OC新特性之块(Block)
文章主要参考 关于OC中的block自己的一些理解(一)
对块的深入理解 浅析ios开发中Block块语法的妙用
1、关于block
block的作用:保存一段代码。
苹果官方推荐的一种语法,类似于C语言的函数,但是比函数更加灵活。
^是block语法的标识。
2、在Object-C中,块被当做一个对象来处理,这个对象可以:
有自己的局部变量
可以传入参数
有返回值
可以访问自己定义时的上下文变量
可以修改自己定义时特定的上下文变量
作为参数传递给其它函数
3、block的基本语法
4、block的使用
- 无返回值无参数
- (void)myFirstBlock
{
//1.定义block
void (^myblock)() = ^{ NSLog(@"无参数无返回值"); }; //2.调用block
myblock();
} //输出结果:2016-02-18 09:56:50.124 01-block[750:25107] 无参数无返回值 有参数没有返回值
- (void)mySecondBlock
{
//1.定义block
void (^mySecondBlock)(int,int) = ^ (int num1,int num2){
NSLog(@"有参数无返回值:%d",num1 + num2);
}; //2.调用block
mySecondBlock(,);
} //输出结果:2016-02-18 10:03:22.221 01-block[811:30160] 有参数无返回值:5- 有参数有返回值
- (void)myThirdBlock
{
//1.定义block
double (^myThirdBlock)(double,double) = ^ (double r1,double r2){
return r1 + r2;
}; //2.调用block
double r3 = myThirdBlock(1.1,2.2);
NSLog(@"有参数有返回值:%f",r3);
} //输出结果:2016-02-18 10:06:42.615 01-block[861:32505] 有参数有返回值:3.300000
5、block的注意点
- Block内部可以访问外部变量
- 默认情况下,Block内部不能修改外部的局部变量
- 给局部变量加上 _block 关键字,则这个局部变量可以在block内部进行修改
- (void)myFourBlock
{
//int num = 5;
__block int num = ;
void (^myFourBlock)() = ^{ num = ;
NSLog(@"%d",num);
};
myFourBlock();
}上述代码中如果num的定义才用第3行的方式,则在运行第六行时会报错:missing __block type specifier; ,才用第4行的定义则可以正确输出:2016-02-18 10:25:02.195 01-block[1016:45943] 6
6、整体应用代码
#import <Foundation/Foundation.h> typedef int (^MyBlock)(int,int); // block类型 int cc = ;
int main(int argc, const char * argv[]) { int a = ;
__block int b = ;
void (^voidBlock)() = ^{
NSLog(@"------------");
//在bloc体内不能修改非__block声明的局部变量,可以修改全局变量和用__block声明的局部变量
//a = 10;
b = ;
cc = ;
};
NSLog(@"%d %d %d",a,b,cc);
voidBlock();
NSLog(@"%d %d %d",a,b,cc); int (^sumBloc)(int , int);
sumBloc= ^(int a,int b){ return a+b;
};
int (^subBloc)(int,int) = ^(int a,int b){
return a - b ;
}; int sum = sumBloc(,);
int sub = subBloc(,); NSLog(@"sum = %d sub = %d",sum,sub); voidBlock(); //------ typedef block类型用法------------ MyBlock sum1 = ^(int a,int b){
return a + b ;
}; MyBlock sub1 ;
sub1 = ^(int a ,int b){
return a - b ;
}; NSLog(@"sum1 = %d sub1 = %d",sum1(,),sub1(,)); return ;
}
OC学习4——OC新特性之块(Block)的更多相关文章
- 可能是最早的学习Android N新特性的文章
可能是最早的学习Android N新特性的文章 Google在今天放出了Android N开发者预览版.Android N支持Nexus6及以上的设备.5太子Nexus5不再得到更新. Android ...
- 从零开始一起学习SLAM | C++新特性要不要学?
LAM,C++编程是必备技能.不过,大家在学校里学习的书本一般比较老,主要还是C++98那些老一套. 本文所谓的C++新特性是指C++11及其以后的C++14.C++17增加的新关键字和新语法特性.其 ...
- iOS开发——新特性OC篇&IOS9 SDK新特性
iOS9 SDK新特性 WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍 ...
- iOS开发——新特性OC篇&IOS9 系统新特性
IOS9 系统新特性 2015年6月89号凌晨召开的WWDC 2015苹果开发者大会发布了全新的iOS 9系统,PC6小编今天给大家整理了这次iOS9的系统更新带来了哪些新的功能与升级,本次新功能一览 ...
- Java学习之==>Java8 新特性详解
一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...
- 前端学习笔记 --ES6新特性
前言 这篇博客是我在b站进行学习es6课程时的笔记总结与补充. 此处贴出up主的教程视频地址:深入解读ES6系列(全18讲) 1.ES6学习之路 1.1 ES6新特性 1. 变量 2. 函数 3. 数 ...
- WEB学习笔记14-HTML5新特性的使用
(1)定义文档类型声明 <!DOCTYPE html> (2)定义页面编码 <!—HTML 4.01中定义的设置页面编码的方式--> <meta http-equiv=& ...
- Java13新特性 -- 文本块
在JDK 12中引入了Raw String Literals特性,但在发布之前就放弃了.这个JEP与引入多行字符串文字(text block) 在意义上是类似的. 这条新特性跟 Kotlin 里的文本 ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- ios学习路线—Objective-C(新特性)
1.方法顺序无关 Objective-C类由声明文件h和实现文件m组成,所有的public方法都在h文件中声明,private方法可以写在m文件中,但是在早期的编译环境中需要注意方法的顺序,例如下面的 ...
随机推荐
- ConcurrentModificationException并发修改异常
//创建集合对象 Collection c = new ArrayList(); c.add("hello"); c.add("world"); c.add(& ...
- Gson的入门使用
Java对象和Json之间的互转,一般用的比较多的两个类库是Jackson和Gson,下面记录一下Gson的学习使用. 基础概念: Serialization:序列化,使Java对象到Json字符串 ...
- Demo002 IDEA中Junit单元测试的使用(初级篇)
推荐JUnit视频教程:JUnit-Java单元测试必备工具. 1.基本理论 1.1 单元测试 单元测试又称模块测试,属于白盒测试,是最小单位的测试.模块分为程序模块和功能模块.功能模块指实现了一个完 ...
- yum安装命令:遇到的问题报错如下: File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: 通过看报错可以了解到是使用了python2的语法,所以了解到当前yum使用的Python2,因为我单独安装了python3,且python3设置为默认版本了,所以导致语法问题 解决方法: 使用python2.6 yum install
1.安装zip yum install -y unzip zip 2.安装lrszs yum -y install lrzsz 3.安装scp 遇到下面的问题: 结果提示: No package sc ...
- 解决IE浏览器缓存导致AJAX请求数据异常
IE10浏览器会把AJAX请求的数据都缓存下来,然后每次想去刷新数据时发现数据都是一样的,于是导致数据显示异常. 解决方法: 在页面<head>标签里,加上以下声明: <!-- 解决 ...
- ES6 Generator 异步编程解决方案&&&promise
Generator: 是比promise更高级的解决方案 next yield function 后加* 状态机 generator语法糖 长轮询 接口常查询 ================= ...
- 拜托!面试请不要再问我Spring Cloud底层原理[z]
[z]https://juejin.im/post/5be13b83f265da6116393fc7 拜托!面试请不要再问我Spring Cloud底层原理 欢迎关注微信公众号:石杉的架构笔记(id: ...
- Tomcat9.0.13 Bug引发的java.io.IOException:(打开的文件过多 Too many open files)导致服务假死
问题背景: 笔者所在的项目组最近把生产环境Tomcat迁移到Linux,算是顺利运行了一段时间,最近一个低概率密度的(too many open files)问题导致服务假死并停止响应客户端客户端请求 ...
- TUN/TAP编程实现
其实关于这两种设备的编程,基本上属于八股文,大家一般都这么干. 启动设备之前 有的linux 并没有将tun 模块编译到内核之中,所以,我们要做的第一件事情就是检查我们的系统是否支持 TUN/TAP ...
- js中加“var”和不加“var”的区别
JavaScript 拥有动态类型.这意味着相同的变量可用作不同的类型: var x // x 为 undefined var x = 6; // x 为数字 var x = "Bill&q ...