ObObjective-C:笔记:Block 代码块

代码块 block

 实现了代码片段像参数那样可以在方法或函数里传递。

代码块本质上是一个和其他变量类似的变量。所不同的是,代码块中存储的数据是一个函数体。

调用代码块就像调用函数一样,传入参数并得到返回值。参数可以是void,返回值也可以是void。

声明一个代码块:

void (^myBlodk)(NSString *) ;
//返回值类型是void , 代码块的名称是myBlock,参数有一个,是NSString类型。

使用等号定义一个代码块:

myBlock = ^(NSString *str)
{
    ……;//这里写代码块的执行语句。
}

使用代码块:

声明一个使用代码块参数的函数:

void useMyBlock(void (^myBlock)(NSString *str));
//函数名是useMyBlock,参数是一个名为myBlock的Block,这个Block需要一个参数str,*str可以不写,只表明参数类型即可;

在函数中使用代码块:

void useMyBlock(void (^myBlock)(NSString *str))
{
    myBlock(@"test");
}

代码块传入对象方法:(和传入函数在语法上不同)

- (void) useMyBlock: (void (^)(NSString))myBlock
                andString:(NSString *)Str
{
    myBlock(@"test");
}
//myBlock是代码块的名称,他前面的括号说明这个Block的原型是什么样子。这里就像传入其他对象参数一样。

代码块可以获得其上文环境定义的,代码块之外的本地变量。而且是只读的。

如果想实现代码块内部可读写功能,需要在定义的变量前面加上 __block修饰。

这些变量在代码块中的值,并不是调用代码块时的值,而是程序第一次初始化代码块时的值。

typedef进行代码块的定义,可以提高可读性:

typedef void (^myBlock)(NSString *);

在方法中使用:

-(void) useMyBlock:(myBlock)newBlock
         andString:(NSString *)Str
{
    newBlock(Str);
}


你可能感兴趣的:(ObObjective-C:笔记:Block 代码块)