blcok,sel学习小结

    iOS开发中,经常会用到两种特殊的数据类型,block和sel,小弟就暂且把这两种数据类型做下总结:

  

1. SEL是一种数据类型,代表方法签名,通过SEL数据类型就能找到这个对象上的某个方法。

SEL sel = @selector(方法名);

使用场景:

(1)作为方法的实参、形参

(2)作为方法的返回值(不常用)

 1.测试某个方法是否能响应一个方法:

BOOL is = [dog respondsToSelector:@selector(show)];

注释:利用方法respondsToSelector(参数是SEL类型变量)测试dog对象是否能响应show这个方法,返回值是一个BOOL类型的变量。

2.方法performSelector:(SEL)withObject:(id)  可以带参数,最多带两个参数,也可以不带参数。

作用:执行某个方法。

2. block:代码块

 是一种数据类型,作用是封装代码。与函数的区别是,函数不能定义在方法或者是函数内部,但是block可以。block的用法同函数类似,可以有返回值,也可以没有返回值,可以带参数,也可以不带参数。

void (^ 名字)(参数列表) =  ^返回值类型 (参数列表){代码};

注意:

1、当block内部使用对象的时候,block内部就会有对对象的一个强引用,可能会有一个循环引用的问题,处理不当的话会造成内存泄漏

 其它普通对象一般没什么,如果是外部对象而且已经有了一个强引用的情况,需要特殊注意。尤其是self对象

屏幕快照 2016-01-21 下午12.01.56.png

 2.block的用处,block 一般用来传值的。(代理:一般封装控件的时候使用代理,为了代码的扩张性。)

 用法:(1)作为回调方法,当作参数放在方法里面。

block做参数的格式:

(void (^)( id responseObject))success : 代码块作为方法的参数的时候的格式

 代码块做参数使用,代码块数据的定义一般在参数里面实现

 (void (^)( id responseObject)):表示代码块数据类型(跟int等等一样)

 success:数据类型名字

 只有将代码块放到方法里面做参数的时候才会使用上面的格式

 在调用这个方法的时候就在方法里面把代码块实现。

基本使用:

    //方式1:声明和定义放到一起

    void(^myblock)(NSString *x) = ^(NSString *str){

        NSLog(@"%@",str);

    };

    

    //调用

    myblock(@"456");

    //方式2

    void(^myblock)(NSString *x);

    myblock = ^(NSString *x){

        NSLog(@"%@",x);

    };

     //调用

    myblock(@"haobang");

其实block 和 方式,函数是类似的,只不过block是一种数据类型而已。在声明和定义的时候只需要指定一个参数,并且制定参数的类型。具体的参数是什么都是在调用的时候赋值的。

传值:代码块主要是用来做传值的,如AFN框架的post,get方法

  传值的条件:

1. 接收方必须有一个属性接收

2. 确定什么时候传

总的来说就是一句话:传值的目标类实现具体代码块怎样做,然后在原始类调用代码块代码加上参数,就把参数传递过去了。

block使用注意点:  block要想保存到模型里面,在mrc中一般使用copy修饰符,因为在mrc中只有copy才会把block放在堆内存中,arc中可以使用strong,copy,目的都是把block放在堆内存中。

原文地址:https://www.cnblogs.com/xiaofei993/p/5314374.html