iOS中Block介绍(一)基础

来源:互联网 发布:identifier c语言 编辑:程序博客网 时间:2024/06/06 03:33

iOS中Block介绍(一)基础

2013-07-19 12:52 佚名 dreamingwish 字号:T |T
一键收藏,随时查看,分享好友!

ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发。讨论范围:block的使用,内存管理,内部实现。不包含的内容:gc arc下的block内存,block在c++中的使用。

AD:2014WOT全球软件技术峰会北京站 课程视频发布


    一、概述

    Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。

    二、热身

    先看一个比较简单的Block例子:

    1. int multiplier = 7;
    2. int (^myBlock)(int) = ^(int num) {
    3. return num * multiplier;
    4. };

    在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?

    来,让我们typedef一下

    1. typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block
    2. typedef int (^IntBlock)(void);//一个没有参数,返回int的block
    3. typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block

    三、更详细的例子

    注意:上面的typedef都还有效~

    主动调用一下:

    1. - (void)someMethod
    2. {
    3. BoolBlock ablock = ^(BOOL bValue) {
    4. NSLog(@"Bool block!");
    5. };
    6. ablock();
    7. }

    作为参数返回:

    1. typedef void (^BoolBlock)(BOOL);
    2. - (BoolBlock)foo()
    3. {
    4. BoolBlock ablock = ^(BOOL bValue) {
    5. NSLog(@"Bool block!");
    6. };
    7. return [[ablock copy] autorelease];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解
    8. }

    类的一个成员:

    1. @interface OBJ1 : NSObject
    2. @property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们
    3. @end
    4. OBJ1 *obj1 = ...
    5. obj1.block = ^(BOOL bValue) {
    6. NSLog(@"Bool block!");
    7. };

    其他函数的参数:

    1. - (void)foo(BoolBlock block)
    2. {
    3. if (block) {
    4. block();
    5. }
    6. }

    甚至其他block的参数:

    1. BoolBlock bBlock = ^(BOOL bV){if(Bv){/*do some thing*/}};
    2. HugeBlock hBlock = ^(BoolBlock bB) {bB();};
    3. hBolck(bBlock);

    啊,全局变量!:

    1. static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;};
    2. int main()
    3. {
    4. printf("%d\n", maxIntBlock(2,10));
    5. return 0;
    6. }

    好了,你知道block大概能怎么用了。

    四,特殊的标记,__block

    如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:

    1. int main()
    2. {
    3. __block int i = 1024;
    4. BoolBlock bBlock = ^(BOOL bV) {
    5. if (bV) {
    6. i++;//如果没有__block标记,是无法通过编译的。
    7. }
    8. };
    9. }

    好了,基础很快,更详细的内容将用来介绍深入的东西。

    0 0
    原创粉丝点击