先了解定义C语言的函数指针!

 int sum (int x, int y) {
return x+ y;
}
// 定义函数
int (*p)(int, int) = sum;
NSLog(@"%ld", p(, )); // 函数指针类型: int (*)(int, int);
// 函数指针变量: p;
// 函数指针的值: sum

看看block语法

  block类型: int(^)(int, int)
block变量: block
block值: ^(int x, int y){
return x + y ;
};

定义block语法块

 int (^block) (int , int) = ^(int x, int y) {
return x + y;
}
NSLog(@"%d", block(, ));

效果和上边的函数指针一样! 参照起来学习方便!

  • 无返回值, 无参数 block 语法

     void(^block1)(void) = ^(void) {
    NSLog(@"无返回值, 无参数");
    }
    // 调用block1
    block1();
  • 有返回值, 无参数
     int(^block2)(void) = ^(void) {
    return ;
    }
    NSLog(@"有返回值, 无参数%d", block2());
  • 无返回值, 有参数
     void (^block3)(int, int) = ^(int x, int y){
    NSLog(@"%d + %d = %d", x, y, x +y);
    };
    调用
    block3(, );
  • 有返回值, 有参数
     int (^block4)(int , int) = ^(int x, int y) {
    return x + y;
    }
    block 调用
    NSLog(@"%d", block4(, ));
block 与变量的关系
  • block 与 局部变量的关系

     int temp = ;
    void (^block1)(void) = ^(void) {
    NSLog(@"%d", temp++);
    NSLog(@"%d", temp + );
    }

    调用 block1();
    如果按照以上代码, 第一个打印会报错!! 因为对temp进行了操作, 也就是说在block中是不能修改局部变量的值的! 而第二个打印却不会报错, 说明block中可以调用局部变量! 那怎样才能在block中修改局部变量的值呢?

     __block int temp2 = ; 用__block修饰一下变量, 便在block可以使用了
    __block int temp2 = ;
    void (^block9) (void) = ^(void){
    temp2++; // 这样就可以修改了!
    };
    调用 block9();
    结果 ;
  • block与全局变量.
     在main函数外定义一个在main函数外定义一个temp3 = ;
    void (^block11) (void) = ^(void){
    temp3++;
    NSLog(@"temp3 = %d", temp3 + );
    };
    调用 block11();
    结果 temp3 = ;

    说明block中可以修改全局变量!

文/安静的等待(简书作者)
原文链接:http://www.jianshu.com/p/abb1eafeb068
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

Object C中Block用法的更多相关文章

  1. iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

    1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...

  2. iOS中block的用法 以及和函数用法的区别

    ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候  MyBlock(); 带参数的 ...

  3. Java之Object对象中的wait()和notifyAll()用法

    用一个例子来说明Object对象中的wait方法和notifyAll方法的使用. 首先定义一个消息类,用于封装数据,以供读写线程进行操作: /** * 消息 * * @author syj */ pu ...

  4. iOS 中Block以及Blocks的使用,闭包方法调用

    OC: -(void)dataWithUrl:(NSString*)string AndId:(NSInteger)id returnName:(void(^)(NSString*name))back ...

  5. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  6. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  7. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  8. .NET3.5中JSON用法以及封装JsonUtils工具类

    .NET3.5中JSON用法以及封装JsonUtils工具类  我们讲到JSON的简单使用,现在我们来研究如何进行封装微软提供的JSON基类,达到更加方便.简单.强大且重用性高的效果. 首先创建一个类 ...

  9. [Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性

    之前的几条都不断地重复着for...in循环,它便利好用,但又容易被原型污染.for...in循环最常见的用法是枚举字典中的元素.这里就是从侧面提出不要在共享的Object.prototype中增加可 ...

随机推荐

  1. [jquery]模仿radio单项选择

    今天写了个小功能,模仿radio单选, //单选收货地址 $(".wuliu-table-to").find(".called").click(function ...

  2. .Net中使用无闪刷新控件时提示框不显示

    今天做提示框的时候一直不显示,让我郁闷好久,晚上吃饭的时候问了同事一下,他给了一个思路, 他说可能是因为由于页面中的无闪刷新导致的结果:百度了一下真找到了解决方法 在页面中存在无闪刷新控件的时候提示框 ...

  3. Java基本数据类型与位运算

    >>赋值运算符 赋值使用操作符“=”.它的意思是“取右边的值(即右值),把它复制给左边(即左值)”.右值可以是任何 常数.变量或者表达式 (只要它能 生成 一个值就行).但左值必须是一个明 ...

  4. cryptkeeper的使用

    转自:http://www.linuxidc.com/Linux/2011-06/37070.htm Cryptkeeper 是加密文件系统 EncFS 的前端工具,以 Gnome Applet 方式 ...

  5. 低功耗蓝牙BLE之连接事件、连接参数和更新方法

    转自:http://blog.csdn.net/zzfenglin/article/details/51304084 连接事件 在一个连接当中,主设备会在每个连接事件里向从设备发送数据包.一个连接事件 ...

  6. Maven 更换远程仓库地址

    1.第一种方式,通过setting.xml的方式配置数据源 该文件路径D:\IDE\apache-maven-3.2.3\conf\setting.xml 该文件大部分内容都已经注释,我们需要添加如下 ...

  7. [C++11][数据结构]自己的双链表实现

    这个双链表,是我模仿stl的list制作的,只实现了一些基本功能,像merge,transfer这些就没有实现,用户可以用基本操作来自己做外部实现. 我没有选用stl的[begin,end)迭代器模式 ...

  8. (iOS)项目总结-项目中遇到的各种的问题和解决方法

    前言: 一到公司报道那时,便着手独立的去完成了一个项目,其中的辛酸泪也是不足为外人道也.这次算是一个新型的app,仍然是独立开发,但心境和想法却是完全的不同.下面说一次以前做开发时常常忽略的知识,也算 ...

  9. jquery点击元素之外触发事件

    $("#errorMsg_layer").bind("click",function(e){ if($(e.target).closest("#err ...

  10. iOS编程中遇到的问题

    1.应用在iPhone6plus 系统iOS9.1安装时没遇到问题,在iPhone4s 系统iOS 7时bulid success 但是安装失败提示 There was an internal API ...