苹果公司正在大力推广Block块语法的使用,据说Block会迟早取代一般协议代理的使用.

  Block最大的作用是函数回调,简化代码.

  在ios中,将blocks当成对象来处理,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。

block官方定义:

 

示例的详解如下: 

 



 

 

  注意block可以使用其定义范围内的变量.

 

  如果你把block声明为一个变量,你可以把它当一个函数(function,本文中特指C语言形式的函数)一样调用:

 

block定义:

  int (^myBlock) (int a,int b) = ^(int a,int b){      

     return a+b;   

   };

 

   如果要修改就要加关键字:__block   双下划线哦!!!

 

 

  简单的回调,废话不多说,直接上代码!!!  第二个页面往第一个页面回调

  先在第二个页面定义一个块,然后写一个方法使用block;

  #import<UIKit/UIKit.h>

  typedefvoid(^myBlock)(NSString*,NSString*,NSInteger);

  @interfaceSecondViewController:UIViewController

  {

      myBlockblock;

  }

 

  -(void)passValueUsingBlock:(myBlock)block1;

 

  @end

   .m文件

  #import"SecondViewController.h"

 

  @interfaceSecondViewController()

  -(IBAction)Back:(id)sender;

 

  @end

 

  @implementationSecondViewController

 

 

  -(void)passValueUsingBlock:(myBlock)block1

  {

      block=block1;

  }

 

  -(void)viewDidLoad

  {

      [superviewDidLoad];

  }

 

  -(IBAction)Back:(id)sender{

      block(@"hello",@"女",21);

      [selfdismissViewControllerAnimated:YEScompletion:nil];

  }

  @end

 

 

  在第一个页面调用这个方法

  

#import"RootViewController.h"

#import"SecondViewController.h"

@interfaceRootViewController()

@property(weak,nonatomic)IBOutletUITextField*name;

@property(weak,nonatomic)IBOutletUITextField*sex;

@property(weak,nonatomic)IBOutletUITextField*age;

-(IBAction)Push:(id)sender;

 

@end

 

@implementationRootViewController

 

-(void)viewDidLoad

{

    [superviewDidLoad];

    //Doanyadditionalsetupafterloadingtheviewfromitsnib.

}

 

-(IBAction)Push:(id)sender{

    SecondViewController*second=[[SecondViewControlleralloc]init];

    [secondpassValueUsingBlock:^(NSString*name,NSString*sex,NSIntegerage){

        self.name.text=name;

        self.sex.text=sex;

        self.age.text=[NSStringstringWithFormat:@"%d",age];

    }];

    [selfpresentViewController:secondanimated:YEScompletion:nil];

}

@end