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对象
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放在堆内存中。