OC语法--block

block 的使用:
block封装了一段代码,可以在任何时候执行;
如果用typedef定义:
block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或者返回值。它和传统的函数指针很类似,但是有区别:block是inline(内联函数)的,并且默认情况下他对局部变量是只读的。

苹果官方建议尽量多用block。在多线程,一部任务,集合遍历,集合排序,动画转场的很多。
int (^Sum)(int,int)=^(int a,int b){
返回值 名称 参数类型   形参
}
和指向函数的指针
int(*sump)(int,int)=sum; sum是函数名
c=(*sump)(9,9);
//block 就是弥补了 指向函数的指针,不能够直接保存一个函数体(代码块);
//在实际开发中,你发现一个方法中的算法,可以有多重实现,你一时还不能确定用哪种更好,你就可以把方法中其中一个参数定义成block方式
实例程序:
1.在OC主函数中定义

        

//        可以这样定义block

//        定义了一个block,这个block返回值是int类型,接受两个int类型的参数

       int (^Sum) (int,int) =^(int a,int b)

        {

           return a+b;

        };

       int a=Sum(10,11);

       NSLog(@"%i",a);

2.在C语言方法中定义

void test2(){

    //__block2个下划线

    __blockint c=15;

   MySum sum=^(int a,int b){

        //block可以访问外面定义变流量,局部变量,但是不能修改

        //但是加了_block就可以了

        

        c=19;

       NSLog(@"c is%i",c);

       return a+b;

    };

   NSLog(@"%i",sum(10,10));

}

3.利用typedef定义

typedefint(^MySum)(int a,int b);

oid test2(){

    //__block2个下划线

    __blockint c=15;

   MySum sum=^(int a,int b){

        //block可以访问外面定义变流量,局部变量,但是不能修改

        //但是加了_block就可以了

        

        c=19;

       NSLog(@"c is%i",c);

       return a+b;

    };

   NSLog(@"%i",sum(10,10));

}


4.block作为成员属性
.h文件

#import <Foundation/Foundation.h>

@class Button;

typedefvoid (^ButtonBlock) (Button *btn);

@interface Button :NSObject

@property(nonatomic,assign)ButtonBlock block;

-(void)click;

@end


.m文件

#import "Button.h"

@implementation Button

-(void)click

{

   _block(self);

}

@end


在方法中使用

Button *btn=[[Buttonalloc]init];

        

        btn.block=^(Button *btn){

           NSLog(@"按钮%@被点击了",btn);     

        };

  [btnclick];


block用在参数的回传。


;