1. #import <Foundation/Foundation.h>
  2.  
  3. /*
  4. block要掌握的东西
  5. 1> 如何定义block变量
  6. int (^sumBlock)(int, int);
  7. void (^myBlock)();
  8.  
  9. 2> 如何利用block封装代码
  10. ^(int a, int b) {
  11. return a - b;
  12. };
  13.  
  14. ^() {
  15. NSLog(@"----------");
  16. };
  17.  
  18. ^ {
  19. NSLog(@"----------");
  20. };
  21.  
  22. 3> block访问外面变量
  23. * block内部可以访问外面的变量
  24. * 默认情况下,block内部不能修改外面的局部变量
  25. * 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
  26.  
  27. 4> 利用typedef定义block类型
  28. typedef int (^MyBlock)(int, int);
  29. // 以后就可以利用MyBlock这种类型来定义block变量
  30. MyBlock block;
  31. MyBlock b1, b2;
  32.  
  33. b1 = ^(int a, int b) {
  34. return a - b;
  35. };
  36.  
  37. MyBlock b3 = ^(int a, int b) {
  38. return a - b;
  39. };
  40. */
  41.  
  42. typedef int (*SumP)(int, int);
  43.  
  44. typedef int (^MyBlock)(int, int);
  45.  
  46. int sum(int a, int b)
  47. {
  48. return a + b;
  49. }
  50.  
  51. int main()
  52. {
  53. // int (*p)(int, int) = sum;
  54. // int (*p2)(int, int) = sum;
  55. // SumP p = sum;
  56. // SumP p2 = sum;
  57.  
  58. /*
  59. int (^sumBlock)(int, int);
  60.  
  61. sumBlock = ^(int a, int b) {
  62. return a + b;
  63. };
  64.  
  65. int (^minusBlock)(int, int) = ^(int a, int b) {
  66. return a - b;
  67. };*/
  68.  
  69. MyBlock sumBlock;
  70. sumBlock = ^(int a, int b) {
  71. return a + b;
  72. };
  73.  
  74. MyBlock minusBlock = ^(int a, int b) {
  75. return a - b;
  76. };
  77.  
  78. MyBlock multiplyBlock = ^(int a, int b) {
  79. return a * b;
  80. };
  81.  
  82. NSLog(@"%d - %d - %d", multiplyBlock(, ), sumBlock( , ), minusBlock(, ));
  83.  
  84. return ;
  85. }
  86.  
  87. void test3()
  88. {
  89. int a = ;
  90. __block int b = ;
  91.  
  92. void (^block)();
  93.  
  94. block = ^{
  95. // block内部可以访问外面的变量
  96. //NSLog(@"a = %d", a);
  97.  
  98. // 默认情况下,block内部不能修改外面的局部变量
  99. // a = 20;
  100.  
  101. // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
  102. b = ;
  103. };
  104.  
  105. block();
  106. }
  107.  
  108. // 有返回值、有形参的block
  109. void test2()
  110. {
  111. /*
  112. // 指针函数的指针
  113. int (*p)(int, int) = sum;
  114. int d = p(10, 12);
  115. NSLog(@"%d", d);
  116. */
  117.  
  118. int (^sumblock)(int, int) = ^(int a, int b){
  119. return a + b;
  120. };
  121.  
  122. int c = sumblock(, );
  123.  
  124. // 用一个block输出n条横线
  125.  
  126. void (^lineBlock)(int) = ^(int n)
  127. {
  128. for (int i = ; i<n; i++) {
  129. NSLog(@"----------------");
  130. }
  131. };
  132. lineBlock();
  133.  
  134. }
  135.  
  136. // 没有返回值、没有形参的block
  137. void test()
  138. {
  139. // block用来保存一段代码
  140. // block的标志:^
  141. /*
  142. block跟函数很像:
  143. 1.可以保存代码
  144. 2.有返回值
  145. 3.有形参
  146. 4.调用方式一样
  147. */
  148.  
  149. // 定义block变量
  150. /*
  151. void (^myblock)() = ^(){
  152. NSLog(@"----------------");
  153. NSLog(@"----------------");
  154. };*/
  155.  
  156. // 如果block没有形参,可以省略后面的()
  157. void (^myblock)() = ^{
  158. NSLog(@"----------------");
  159. NSLog(@"----------------");
  160. };
  161.  
  162. // 利用block变量调用block内部的代码
  163. myblock();
  164.  
  165. myblock();
  166. }
  • Block封装了一段代码,可以在任何时候执行
  • Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
  • 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
 

Blocks的定义:

  1. int (^MySum)(int, int) = ^(int a, int b) {
  2.  
  3. return a+b;
  4.  
  5. };

定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现

Block可以访问局部变量,但是不能修改。

  1. int sum = ;
  2.  
  3. int (^MyBlock)(int) = ^(int num) {
  4.  
  5. sum++;//编译报错
  6.  
  7. return num * sum;
  8.  
  9. };

如果要修改就要加关键字:__block

__block int sum = 10;

Blocks和函数指针对比:

  • 定义函数指针   int (*myFn)();
  • 定义Blocks   int (^MyBlocks)(int,int);
  • 调用函数指针   (*myFn)(10, 20);
  • 调用Blocks    MyBlocks(10, 20);

Blocks的赋值

1,在声明的同时定义变量,然后赋值

int (^MySum)(int,int) = ^(int a,int b) {

return a + b;

};

2,也可先用typedef先声明类型,再定义变量进行赋值

typedef int (^MySum)(int,int);

MySum sum = ^(int a,int b) {

return a + b;

};

OC-block的更多相关文章

  1. Swift3.0 函数闭包与OC Block

    刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> S ...

  2. OC Block网上转载

    1.block是一个特殊的OC对象, 它建立在栈上, 而不是堆上, 这么做一个是为性能考虑,还有就是方便访问局部变量. 2.默认情况下block使用到的局部变量都会被复制,而不是保留.所以它无法改变局 ...

  3. OC BLOCK和协议

    一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. block实际上是: 指向结构体的指针 BOLC ...

  4. OC block的简单使用

    http://blog.csdn.net/itpeng523/article/details/23965147 一.先用Xcode创建一个空工程 学习block之前先用弄懂c语言的函数指针 看代码: ...

  5. iOS - OC Block 代码块

    前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...

  6. oc block基本使用

    // // main.m // block基本使用 // // Created by Ymmmsick on 15/7/21. // Copyright (c) 2015年 Ymmmsick. All ...

  7. [OC] Block的使用

    由ControllerA跳转到controllerB,在controllerB中选择一个参数的值,并将它传回给controllerA. 首先,在controllerB的.h文件中写入: @interf ...

  8. OC Block(代码块)

    #import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...

  9. OC block声明和使用

    #import "Button.h" typedef int (^MySum) (int, int); void test() { // 定义了一个block,这个block返回值 ...

  10. oc block 遍历数组及字典

    原遍历数组NSArray * lines = ...for (NSString * line in lines) { // ...}for (int i = 0; i < lines.count ...

随机推荐

  1. java:提示Could not initialize class sun.awt.X11GraphicsEnvironment

    前几天发现tomcat提示 Could not initialize class sun.awt.X11GraphicsEnvironment  问题.以为不验证,就没太关注,今天发现,有同事提示了个 ...

  2. ajax技术应用(转)

    ajax简介 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.Ajax不 ...

  3. 安装python-docx

    安装环境: windows 7 64位 python 3.4.2 64位 说明: 用pip install python-docx不行,当装lxml时出现错误,一直卡在那. 安装非官方的版本,如下图, ...

  4. 如何在iOS9的plist文件中配置不使用https

    App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Te ...

  5. [学习笔记]概率&期望

    概率的性质 非负性:对于每一个事件$A,0\;\leq\;P(A)\;\leq\;1$. 规范性:对于必然事件$S,P(S)=1$;对于不可能事件$A,P(A)=0$. 容斥性:对于任意两个事件$A, ...

  6. 【caffe】无法找到gpu/mxGPUArray.h: No such file or directory

    @tags: caffe 问题出现在,windows下编译caffe的过程中.按照github.com/microsoft/caffe的readme配置的. 问题原因是,用的matlab版本较新(20 ...

  7. nand以及yaffs2

    用的是tiny210+1312的SDK,友善之臂给的文件系统居然有300多兆,烧写系统可是要人命了,那个等啊...所以,想着把系统给做小一点.和其他一样,我的知识仅限于理论阶段,嘿嘿.今天实践一下. ...

  8. fabric note

    #!/usr/bin/env python # -*- coding:utf-8 -*- from fabric.api import * from fabric.context_managers i ...

  9. [IOS swift对比oc]

    http://www.cocoachina.com/industry/20140605/8686.html WWDC 2014上苹果再次惊世骇俗的推出了新的编程语言Swift 雨燕, 这个消息会前没有 ...

  10. django admin中保存添加的数据提示need string or buffer, int found

    原因 def __unicode__(self): return unicode(self.pk) 此处如果没有unicode就会报这个错误,原因就是编码错误 以为是文件开始没有加utf-8导致的,然 ...