首页 > 代码库 > ios之block

ios之block

Block基本概念Block是OC中的一种数据类型是一个能工作的代码单元,可以在任何需要的时候被执行本质上是轻量级的匿名函数,可以作为其他函数的参数或者返回值块代码本身可能有一个参数列表,也可能有一个返回值可以把块代码赋给一个变量,并在需要的时候调用,就像调用一个普通函数一样块代码使用的注意事项默认情况下,不允许在块代码内部修改外部变量的数值__block循环引用 __weak格式说明:(返回类型)(^块名称)(参数类型列表) = ^(形参列表) {代码实现};void (^myBlock)(int,int) = ^(int x , int y) {      //代码实现        }//下面是Block的简单使用#import <Foundation/Foundation.h>typedef double(^MyBlock)(double, double);MyBlock area = ^(double x, double y) {    return x * y;};int a = 0;static int b = 11;/** block的定义*/void test1(){    // block 定义,是准备好一段代码片段,在需要的时候执行    // block是C语言的格式    // 输入:inlineblock    // 格式:返回类型 (^blockName) (参数类型) = ^(形参列表) { 代码实现 };    // 提示:如果没有参数,格式可以简化    // 格式:返回类型 (^blockName) () = ^ { 代码实现 };    void (^myBlock)() = ^{        NSLog(@"block的最简单定义");    };    //调用myblock    myBlock();        //最全的定义    int (^block) (int , int , int) = ^(int x, int y, int z)    {        return x + y + z;    };        int sum = 0;    sum = block(10,19,20);        NSLog(@"sum - %d",sum);    }/** 外部访问变量,常见面试题1*/void test2(){    int x = 10;    __block int y = 20;    NSLog(@"x - %d , x - add - %p",x,&x);        // 在定义block时,如果block中使用到外部的“局部”变量,block会建立该变量的副本(会记录当前x的数值)    void (^block)() = ^{/**********在使用局部变量时,默认不允许在块代码中直接修改局部变量的数值********///        x = 20;                /************全局变量可以在block中修改其值******************/        a = 10;        /**********如果要在block中修改外部变量的值,需要使用 __block***************/        y = 30;        NSLog(@"block - x = %d",x);        NSLog(@"block - x = %p",&x); //默认存储是再栈中    };    block();    NSLog(@"最后的x = %d",x);    }/** 外部访问变量,常见面试题2*/void test3(){    NSMutableString *str = [NSMutableString stringWithFormat:@"hello"];    NSLog(@"定义之前 - %p 定义之前 - %p", &str, str);    void (^block)() = ^{     // 修改指针指向内存空间的内容        [str setString:@"水水水水"];        NSLog(@"block里面通过指针 - %p %@", &str, str);            };        block();}int main(int argc, const char * argv[]){                test3();    return 0;}

 

 

ios之block