Blocks一些特性介绍

来源:互联网 发布:c语言的h文件 编辑:程序博客网 时间:2024/05/05 10:46

//Block特性介绍

#import<Foundation/Foundation.h>

//

//#include <iostream>

//#include <typeinfo>

//using namespace std;

//template <typename T>

//void BlockTest(T pBlock)

//{

//    pBlock();

//    cout << "The type is: " << typeid(T).name() << endl;

//}

//static void Hi(void)

//{

//    NSLog(@"Hi, there!");

//}

//int main(int argc, const char* argv[])

//{

//    BlockTest(Hi);

//}



int main(int argc,const char * argv[]) {

   @autoreleasepool {

       // insert code here...

       NSLog(@"Hello, World!");

       // insert code here...

       //dispatch_queue_t queue = dispatch_queue_create("com.example.LeiQueue", NULL);

       //step1

       //声明一个变量void(^iblocks)(void) 表示一个指向void(void)的函数块应用

      void(^iblocks)(void) = ^(void){//^(void){ puts("Hello, world!"); };则表示一个函数块,它接受void类型参数,并且返回void

           puts("Hello Lei");

          return;

        };

        iblocks();

       //step2 block 数组

       void (^p[2])(void) = {

            ^(void){puts("Hello, world!"); },

            ^(void){puts("Goodbye!"); }

        };

        p[0](),

        p[1]();//这里的p类型为void(^2)(void),表示含有2void(^)void块引用元素变量


       //Block语法递归函数实现

       //一种方法是全局的或都staticblock可以实现

       void (^q)(int)= 0;//初始化变量

       static void (^const blocks)(int) = ^(int i){

           if(i > 0)

            {  puts("Hello, world!");

                blocks(i - 1);

            }

        };

        q = blocks;

        q(2);

       //递归一种方法就是直接将block块也用__block来进行声明就可以了

       __block void (^tblocks)(int);

        tblocks = ^(int i){

           if(i > 0){

               puts("Hello, world!");

                tblocks(i - 1);

            }

        };

        tblocks(2);

       //Blocks结合泛型的使用

       //一般的外部函数能够作为模板参数

       //C++标准中明确指出,模板参数必须为常量表达式,如果是函数的话必须是带有外部连接(即external-linkage)的函数指针。而Blocks表达式首先就不是一个常量表达式,然后它也没有外部连接。

       //泛型的好处:最大的意义就是代码重用和类型安全了,不需要在运行时过多的强制类型转换,在编译时就知道类型。


       //闭包是一个函数(或指向函数的指针),再加上该函数执行的外部的上下文变量(有时候也称作自由变量)。

      // block实际上就是Objective-C语言对于闭包的实现。 block配合上dispatch_queue,可以方便地实现简单的多线程编程和异步编程

       //闭包:(假设两个临时变量数组,在block函数块里进行拷贝,原始数据不变)

       //声明block的时候实际上是把当时的临时变量又复制了一份,在block里即使修改了这些复制的变量,也不影响外面的原始变量。即所谓的闭包

       //当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做的修改,在block外面也一样生效

       NSMutableArray *mArray = [NSMutableArrayarrayWithObjects:@"a",@"b",@"abc",nil];

       NSMutableArray *mArrayCount = [NSMutableArrayarrayWithCapacity:1];

        [mArrayenumerateObjectsWithOptions:NSEnumerationConcurrentusingBlock: ^(id obj,NSUInteger idx,BOOL *stop){

            [mArrayCountaddObject:[NSNumbernumberWithInt:[obj length]]];

        }];


       NSLog(@"%@",mArrayCount);

       //闭包的好处:用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中

     }

   return 0;

}

0 0
原创粉丝点击