OC教程6-1-block各种用法

来源:互联网 发布:最新影视软件 编辑:程序博客网 时间:2024/05/16 01:04

block:又称代码块,闭包;代码块是对一段代码的封装,代码块可以作为一个对象来使用,类似于函数指针变量,可以作为函数的参数来进行传递,也可以直接在代码中匿名实现.

使用block可以方便我们封装SDk,代码简洁,耦合性低

block的定义和实现类似函数的声明和实现

block的类型可以从xcode右侧的代码片段里直接拖拽即可.

////  main.m//  TestBlock////  Created by  on 14-8-11.//  Copyright (c) 2014年xx. All rights reserved.//#import<Foundation/Foundation.h>typedef int (^MyBlock) (int, int);//定义一个block然后可以被多次使用//代码块作为形参使用,代码跨名字可以任意,但是参数和返回类型在传入时要和括号中的保持一致//1.block作为函数的参数使用int getResult(int(^mYblock)(int ,int ))//传入该类型的block参数,名称可以有很多{    int r=mYblock(200,100);//调用该代码块(未实现)        NSLog(@"r结果是%i",r);    return 0;}int main(int argc,const char * argv[]){   @autoreleasepool    {       int c=2;   //在block内部可以读外面的局部变量,但是不能修改,要修改需要加上__block声明        //0.定义一个代码块可读可写的变量     __block int c2=1;//block可以修改的局部变量,不使用__block是无法修改C的(不加的话在block内只读的)     //2.定义一个block       int (^myBlock)(int ,int);  //声明一个block,在下面可以实现     //3.实现一个block          myBlock=^(int m,int n)
          NSLog(@"m==%i,n==%i",m,n);   
         return m*n*c*(c2=c2+1);
        };//把block当做一个变量      //4.调用block          int r=myBlock(7,8);       NSLog(@"%i",r);                int(^mYblock)(int ,int )=^(int m1,int n1)//一个具体的block的实现,可以当一个变量使用        {           return m1-n1;        };
       //5.block作为参数使用               getResult(mYblock);                 //去掉int(^mYblock)(int ,int )=就可以了,相当于传入的参数直接把block实现       //getResult(int(^mYblock)(int ,int )=^(int m2,int n2){return m2+n2;});//报错,写法错误!               //6.内联代码块的定义实现一个代码块,可以不用声明,直接实现,代码简洁,类似于Java的匿名内部类        getResult(^(int m2,int n2){NSLog(@"使用内联代码块!");return m2+n2;});                           int(^xxxBlock)(int,int )=^(int m3,int n3){return m3+n3;};//由此可见,函数开头的声明的参数,跟具体的名字无关,只要是block的类型是一样的即可        getResult(xxxBlock);        // int(^yyyBlock)(int x)=^(int x){ NSLog(@"x的值是:%i",x);  return x;};               //getResult(yyyBlock);//报错,说明,参数的类型和个数必须一致,但是名字可以是别的       }    return 0;}

原文地址:http://blog.csdn.net/yangbingbinga

0 0
原创粉丝点击