【黑马程序员】Block
2015-08-25 16:25
351 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一 block的概念和基本使用
二 block的typedef
三 block訪問外部變量
四 block作為函數的返回值
五 block使用技巧和注意
總結
block对象是一个C级别的语法和运行机制。它与标准的C函数类似,不同之处在于,它除了有可执行代码意外,它还包含了与堆、栈内存绑定的变量。因此,block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响。
你可以用block来写一些可以传到API中的函数语句,可选择性的存储,并可以使用多线程。作为一个回调,block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间需要的数据。
2.block的基本使用
用^操作符来声明一个block变量,并指明block述句的开始。block的主体包含在{}內,像下面的例子中一样(与C语法一样,”;”指明语句的结束):
block的定義和使用
格式:
在block內部可以訪問變量,但是注意,這是一個新的內存空間變量
2)在block內部不可以修改block外部的變量
默認情況下,block內部不能修改外部的局部變量
輸入:inlineBlock得到如下提示
生成如下代碼
2.block變量用作方法的參數時
最好把參數類型列表部分加上 具體的形參名
直接寫代碼就可以了
一 block的概念和基本使用
二 block的typedef
三 block訪問外部變量
四 block作為函數的返回值
五 block使用技巧和注意
總結
一 block的概念和基本使用
1.bloc的概念block对象是一个C级别的语法和运行机制。它与标准的C函数类似,不同之处在于,它除了有可执行代码意外,它还包含了与堆、栈内存绑定的变量。因此,block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响。
你可以用block来写一些可以传到API中的函数语句,可选择性的存储,并可以使用多线程。作为一个回调,block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间需要的数据。
2.block的基本使用
用^操作符来声明一个block变量,并指明block述句的开始。block的主体包含在{}內,像下面的例子中一样(与C语法一样,”;”指明语句的结束):
int multiplier = 7; int (^myBlock)(int) = ^(int num)}{return num * multipiler;};//int 是block的返回值,myBlock是一個塊對象,(int)是參數的類型。num是參數的名稱。{return .....};是塊對象的主體部分。
block的定義和使用
/* 定義格式: 返回類型(^block名稱)(參數列表) = ^返回類型(參數列表){代碼實現}; */ //無參無返回值 void(^myBlock)() = ^{ NSLog(@"hello"); }; myBlock(); //調用方法 //有參無返回值 void(^sumBlock1)(int, int) = ^(int x, int y){ NSLog(@"x + y = %d", x + y); }; sumBlock(10, 20)p; //調用方法 //有參有返回值 int (^sumBlock2)(int, int) = ^int(int a, int b){ return a+b; }; NSLog(@"%d", sumBlock2(4, 8));//調用方法
二 block的typedef
利用typedef定義block類型(和指向函數的指針很像)格式:
/* typedef 返回值類型(^block變量名)(參數類型列表); typedef int(^MyBlock)(int, int); */ //給無參無返回值block變量起別名: //格式:void(^新類型名)(); typedef void (^newType)(); newType t1; t1 = ^{ NSLog(@"我是使用newTypede定義出來的變量t1的值"); }; t1(); //使用block //定義有參無返回值block變量別名 typedef void (^newType2)(int, int); newType2 t2; t2 = ^(int x, int y){ NSLog(@"x+y = %d", x+y); }; t2(23, 12); //有參又返返回值 typedef int (^newType3)(int, int); newType3 t3; t3 = ^(int a, int b){ return a+b; }; NSLog(@"a + b = %d", t3(10, 20));
三 block訪問外部變量
1)在block內部可以訪問block外部的變量在block內部可以訪問變量,但是注意,這是一個新的內存空間變量
//block外部定義的變量 int m = 10 //定義block void (^myBlock)() = ^{ NSLog(@"m = %d", m); }; //使用block myBlock();
2)在block內部不可以修改block外部的變量
默認情況下,block內部不能修改外部的局部變量
//block外部定義的變量 int m = 10; //定義block void (^myBlock)() = ^{ m = 100; //這樣寫,編譯器會報錯 //若果打印出變量m的地址的話,就可以看到block內部的m和block外部的m的地址並不一樣,說明block內部的m是新分配的一塊內存,並且block內部的變量是只讀的 } //給局部變量加上__block關鍵字,則這個局部變量可以在block內部修改 main(int argc, const char * argv[]){ @autoreleasepool{ //block外部定義的變量 __block int m = 10; //定義block void(^myBlock)() = ^{ m = 100; //加了__block前綴的變量,則可以在block內部修改 NSLog(@"m = %d", m); myBlock(); }; } return 0; }
四 block作為函數的返回值
//使用typedef定義一個新的類型 //1.給block起一個別名 typedef int (^newType)(int num1, int num2); //2.使用新類型作為函數的返回值 newType test(){ return ^(int x, int y){ return x+y; }; //3.定義變量接受函數返回的值(block類型) newType nt = test(); NSLog(@"nt(45,23) = %d", nt(45,23));
五 block使用技巧和注意
1.block的快速提示:輸入:inlineBlock得到如下提示
生成如下代碼
2.block變量用作方法的參數時
最好把參數類型列表部分加上 具體的形參名
直接寫代碼就可以了
總結
block是一個可以寫代碼塊的變量,類似于一個文件指針的東西,可以讓block變量來存儲一段代碼。相关文章推荐
- 黑马程序员—IOS基础视频—多态点语法类对象
- 黑马程序员—IOS加强视频—foundation框架
- 百度面试题 运用递归求最大重复数
- 【iOS学习笔记】面试题归总
- 作为码农,我们为什么要写作
- 机器学习算法面试—口述(3):贝叶斯分类器
- 华为近两年嵌入式面试题目
- 面试题总结(有空就更新)
- 黑马程序员——C语言之构造类型(结构体、枚举)
- 黑马程序员——C语言之字符串操作函数与内存管理
- 黑马程序员——C语言之字符串指针与二维字符串数组
- 程序员开发学习网站
- 黑马程序员——异常Exception
- 国外程序员常去的14个开发社区
- 面试题25二叉树中和为某一值的路径
- 程序员应有素质
- 黑马程序员--OC学习篇之Foundation框架中的NSString对象和NSMutableString对象
- 黑马程序员——Java 基础 面向对象之封装 (复习)
- 金指科技(大连)公司-面试总结
- Android(java)学习笔记195:三重for循环的优化(Java面试题)