zoukankan      html  css  js  c++  java
  • OC中的block

    block的概念

    1     block是一个类型,block对象是一个C级别的语法和运行机制,它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,Block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响
    2     你可以用Block来写一些可以传到API中的函数语句,可选择性地存储,并可以使用多线程.作为一个回调,Block特别的有用,因为Block即包含了回调期间的代码,又包含了执行期间需要的数据
    3     由于Objective-C 和 C++ 都是衍生自 C,block被设计为可同时兼容三种语言

    block的基本用法

     1"^" 操作符来声明一个Block变量,并指明Block述句的开始,Block的主体部分包含在{}内,像下面的例子中一样(与C语法一样,";" 指明语句的结束
     2     例:
     3     int (^myBlock)(int) =^(int num){return num * nuItiplier;};
     4 
     5     1)block最简单形式
     6         定义格式:
     7             void test(){};---->void (test)()=^{};
     8             返回值类型 (^变量名)(参数)=^{
     9                 代码块
    10             };    
    11         调用格式:
    12              block 变量名();
    13     
    14         例如:
    15             //定义block变量的同时进行赋值
    16             void(^myTest)()=^{
    17 
    18             };
    19             //先定义后赋值
    20             void (^myTest1)();
    21             myTest1=^{
    22 
    23             };
    24 
    25     //使用block
    26         myTest();    
    27 
    28  带有参数的block
    29 
    30             void (^myBlock)(int ,int )=^(int x,int y){};
    31 
    32 带有参数并带有返回值的block
    33             int (^blockSum)(int,int)=^(int x,int y){return x+y};

    block的typedef

     1 指针回顾
     2     指针和指针的关系
     3   
     4     指针和数组之间的关系
     5        1)指针和一维数组(数组指针)
     6        2)指针和二维数组
     7 
     8     指针和字符串
     9 
    10     指针和函数
    11        1)指针函数
    12        2)函数指针
    13 
    14      指针和结构体
    15    
    16      指针和文件
    17 
    18 函数指针的回顾
    19     1)函数指针的使用:
    20             函数指针变量定义的一般形式为:
    21                 类型说明符 (*指针变量名)();
    22             其实"类型说明符" 表示被指函数的返回值的类型
    23             (* 指针变量名)表示 * 后面的变量是定义的指针变量
    24     
    25              typedef int (*newType)(int x ,int y);
    26             newType 是别名
    27 
    28 block别名的使用
    29 
    30         1) 
    31             //MyBlock2 是一个bolock 变量名
    32             //先定义block变量,再给变量赋值
    33             //  myBlock2 特点:
    34             //             只能赋值这样block ;1 没有返回值  2没有参数
    35                 void (^myBlock2)();
    36                 myBlock2=^{};
    37                 myBlock2();
    38 
    39         2)给没有返回值 并且没有参数的block类型起一个别名
    40                 typedef void (^newBlockType)();
    41             //此时注意,newBlockType不再是一个block类型的变量名了,是一个新的类型
    42         
    43             newBlockType f1;//f1 是一个 没有返回值,没有参数类型的变量名
    44             
    45             f1=^{};
    46             f1();
    47 
    48         3)有参数的
    49             typedef int (^newBlockType2)(int ,int);
    50             new BlockType2 f2=  ^(int numb,int num2){
    51                     return numb+num2;
    52             };
    53             int s =f2(20,12);

    在block内部修改外部的值

    1 需要在外部的变量前 加上__block
    2 
    3     例如:
    4         __block int m =1200;
    5 
    6         void (^myBlock)()=^{
    7                m=1000;   
    8         };        

    将block作为参数使用

     1 void days(void (^dayBlock)(){
     2      NSLog(@"起床");
     3       dayBlock();
     4      NSLog(@"起床");
     5 }    
     6 
     7 //调用days有两种方法
     8 1)传一个block类型的变量过去
     9 void(^block1)()=^{};
    10 days(block1);
    11 
    12 2)调用函数的同时,同时传递参数
    13 days(^{});

    将block作为函数的返回值

     1 1)使用typedef 定义一个新的类型
     2 //给block起一个别名
     3 
     4 typedef int (^newType)(int num1,int num2);
     5 
     6 2)使用新类型作为函数的返回值
     7 
     8 //定义一个返回值是block类型的函数
     9 newType test4(){
    10       newType work=^(int x,int y){
    11            return x+y;
    12       }
    13     return work;
    14 }    

    block使用技巧以及注意

     1 1)block变量用作方法的参数的时候
     2 最好把参数类型列表部分加上,具体的形参名
     3 void test4(int (^myBlock)(int num1,int num2)){
     4 
     5 }
     6 //当block代码块直接作为函数的参数
     7 //写法发生变化了
     8 //参数 这样写: ^int (int x,int y){return x+y;}
     9 int main(int argc,const char *argv[]){
    10       test4(^int(int num1,int num2)myBlock);
    11        return 0;
    12 }
    13 
    14 
    15 
    16 
    17 block和函数的区别
    18 1)定义方式不一样
    19 2)block是一个类型
    20 3)函数不可以嵌套定义,block可以嵌套
    21 4)block因为是一种数据类型,所以可以作为函数的参数和返回值
    22    函数则不可以    
    23 5)block可以作为类型修饰变量,函数不行
  • 相关阅读:
    阿里巴巴校招内推简历筛选方案
    SIFT中的尺度空间和传统图像金字塔
    boost的编译
    H264与RTP
    link2001错误无法解析外部符号metaObject
    windows 7下qtcreator里QWT文件的pro配置
    电脑键盘上你所不知道的秘密,学会了很牛气!
    http://blog.csdn.net/chenriwei2/article/details/38047119
    Seaborn中的kdeplot、rugplot、distplot与jointplot
    8-Pandas扩展之Pandas提升性能的方法(eval()、query())
  • 原文地址:https://www.cnblogs.com/developer-wang/p/4506162.html
Copyright © 2011-2022 走看看