Block

Block

 

目录

  • 概述——对Block的理解
  • Block的操作

       创建Block

       使用Block

  • Block的用途

界面传值

block作为函数参数

  • Delegate、Block和Notification的区别与联系

  

概述——对Block的理解

     Block代码块,有时候我们可以把功能代码块的封装放到block里面,然后通过使用block来实现某些功能,除此之外,block还有很多其他强大的功能

 

Block的操作

创建Block

返回类型 (^block名)(参数列表) = ^(参数列表){      };

例如

void (^myblock)( ) = ^( ){   };

int (^myblock)( int,int) = ^(int a,int b){对a、b的处理;return 返回值;};

使用Block

需要带上“( )”,例如:myblock( );myblock(10,20);

block里面改变外部的局部变量

  • block内部可以访问外部变量
  • 默认情况下,block内部不能修改外部的局部变量
  • 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改

使用typedef定义block类型(和指向函数的指针很像),感觉有点像面向对象编程中松耦合和多态的思想,例如:

typedef int (^myblock3)(int,int);

myblock3 block0,block1;

block0 = ^(int a,int b){return a-b;};

block1 = ^(int a,int b){return a+b;};

 

Block的用途

界面传值

在SecondViewController.h中定义一个block,并用该block给SecondViewContrller声明一个block对象

typedef void (^PassValueBlock)(NSString *);

@property (nonatomic,copy) PassValueBlock passValueBlock;

当SecondViewController消失时,调回到第一个界面所做处理

if(_passValueBlock !=nil &&![_textField.text isEqualToString:@""]){

_passValueBlock(_textField.text);

}

在FirstViewController中,跳转前所做处理

PassValueBlock block = ^(NSString *str){

  _showLabel.text = str;

};

secondVC.passValueBlock = block;

block作为函数参数

函数定义

-(void)compareA:(int)numA andB:(int)numB withBigger:(void (^)(int p))big andSmaller:(void (^)(int p))small{

if(numA>numB){

  big(numA+numB);

}else{

  small(numA-numB);

}  

}

函数调用

[myClass compareA:10 andB:20 withBigger:^(int p){

  //block对函数定义里所生成的p做的处理

}andSmaller:^(int p){

  //block对函数定义里所生成的p做的处理

}];

 

Delegate、Block和Notification的区别与联系

区别

 

1. Most delegate protocols have a handful of messages.

 

 we can say that “If an object has more than one distinct event, use delegation.”

2. An object can only have one delegate.

 

原文地址:https://www.cnblogs.com/IOS-Developer/p/4128683.html