iOS中Block介绍(一)基础
来源:互联网 发布:proteus单片机仿真使用 编辑:程序博客网 时间:2024/05/29 17:22
iOS中Block介绍(一)基础
ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发。讨论范围:block的使用,内存管理,内部实现。不包含的内容:gc arc下的block内存,block在c++中的使用。
一、概述
Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。
二、热身
先看一个比较简单的Block例子:
- int multiplier = 7;
- int (^myBlock)(int) = ^(int num) {
- return num * multiplier;
- };
在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?
来,让我们typedef一下
- typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block
- typedef int (^IntBlock)(void);//一个没有参数,返回int的block
- typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block
三、更详细的例子
注意:上面的typedef都还有效~
主动调用一下:
- - (void)someMethod
- {
- BoolBlock ablock = ^(BOOL bValue) {
- NSLog(@"Bool block!");
- };
- ablock();
- }
作为参数返回:
- typedef void (^BoolBlock)(BOOL);
- - (BoolBlock)foo()
- {
- BoolBlock ablock = ^(BOOL bValue) {
- NSLog(@"Bool block!");
- };
- return [[ablock copy] autorelease];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解
- }
类的一个成员:
- @interface OBJ1 : NSObject
- @property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们
- @end
- OBJ1 *obj1 = ...
- obj1.block = ^(BOOL bValue) {
- NSLog(@"Bool block!");
- };
其他函数的参数:
- - (void)foo(BoolBlock block)
- {
- if (block) {
- block();
- }
- }
甚至其他block的参数:
- BoolBlock bBlock = ^(BOOL bV){if(Bv){/*do some thing*/}};
- HugeBlock hBlock = ^(BoolBlock bB) {bB();};
- hBolck(bBlock);
啊,全局变量!:
- static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;};
- int main()
- {
- printf("%d\n", maxIntBlock(2,10));
- return 0;
- }
好了,你知道block大概能怎么用了。
四,特殊的标记,__block
如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:
- int main()
- {
- __block int i = 1024;
- BoolBlock bBlock = ^(BOOL bV) {
- if (bV) {
- i++;//如果没有__block标记,是无法通过编译的。
- }
- };
- }
好了,基础很快,更详细的内容将用来介绍深入的东西。
0 0
- iOS中Block介绍(一)基础
- iOS中Block介绍(一)基础
- iOS中Block介绍(一)基础
- iOS中Block介绍(一)基础
- iOS中Block介绍(一)基础
- iOS中Block介绍(一)基础
- iOS中Block介绍(一)基础
- iOS中Block介绍(一)基础
- iOS中Block介绍(一)基础
- iOS中Block介绍(一)基础
- iOS中Block介绍(一)基础
- Block介绍(一)基础
- Block介绍(一)基础
- Block介绍(一)基础
- Block介绍(一)基础
- Block介绍(一)基础
- Block介绍(一)基础
- Block介绍(一)基础
- Eclipse提示Found 3 versions of android-support-v4.jar in the dependency list解决方法
- Measure(0,0)到底发生了什么
- CI中奇葩而有趣的坑
- ConcurrentHashMap源码-转载
- Python os.path 模块介绍
- iOS中Block介绍(一)基础
- String.intern()-字符串常量池
- HDU3631(Shortest Path)
- 【读书笔记】iOS-读取文本文件
- iOS 宏(define)与常量(const)的正确使用
- 天平秤药丸
- 剑指offer面试题java实现之题6:重建二叉树
- hdoj找新朋友
- bootstrap-datepicker.js日期控件的改变,就一点,不要吐槽