Block及其使用
FunctionPoint函数指针
什么是函数指针?
函数指针顾名思义就是指向函数的指针,之前学过的指向整型变量的指针就是整型指针、指向结构体变量的指针就是结构体指针。依次类推,函数指针得其义。
函数指针在C语言中分量
函数内容在C语言中分量很重,函数的调用直接意义上大大简化了我们程序员的代码量,而且给简化了我们的思维量。函数指针指向的就是函数,一个指针可以调用函数,比函数的调用更加简化,因此分量超过函数。
函数指针的定义与表示?
-(int)sum(int x,int y)函数
-(int)sum(int x,int y)
{
return x+y;
}
-(int)(*p)(int x,int y)函数指针
表示:我是一个拥有两个整型参数,一个整型返回值的函数指针。
指针类型:-(int)(*)(int x,int y)
指针变量名:p
函数指针的调用?
Block
什么是BLOCK(block在OC中的分量)?
Block就是把一个OC中的函数打包成一个闭包,然后用指针来指向这个闭包,从而达到调用这个闭包内容的目的。Block的这个功能跟函数指针十分类似。
Block的定义与表示?
定义一个block
void (^sum)(int ,int)=^(int x,int y)
{
NSLog(@”%d”,x+y);
}
Blockde 调用?
sum(2,3);
上题中就是一个block闭包,其实block就是一个指针,只不过这个指针指向的是一个特定参数和特定返回值的函数,调用这个Block就是直接将形参导入。
另外block指针可以指向另外一个block
void (^sum)(int ,int )=^(int x,int y)
{
NSLog(@”%d”,x-y);
};
sum(3,4);
这就是block指针的重指向,对于sum块来说,变量类型还是void(^)(int ,int),变量名还是sum,唯一变的就是这个块里面的实现。
对于这种情况,我们可以将变量类型进行重新定义表示
typedef void(^newSum)(int, int);
newSumsum1=^(int x,int y){
NSLog(@”%d”,x*y);
};
几种常见的Block情况?
无返回值无参数
void (^block)( )=^{ sentences;};
block();
无返回值有参数
void (^block)(int )=^(int x){sentences;};
block (x);
有返回值无参数
int(^block)()=^int (){sentences;};
int a=block();
有返回值有参数
int(^block)(int)=^int (int x){sentences;};
int a=block(x);
Main函数中的block使用
.m文件中的block使用
后续会联系实际项目内容个进行讲解。
Block中局部变量和全局变量?
局部变量会以const变量被拷贝并存储到block中,也就是说block对其是只读的。如果尝试在block内部给make变量赋值,会抛出编译器错误。
以const拷贝的方式访问非局部变量,意味着block实际上并不是真正的访问了非局部变量——只不过在block中创建了非局部变量的一个快照。当定义block时,无论非局部变量的值是什么,都将被冻结,并且block会一直使用这个值,即使在之后的代码中修改了非局部变量的值。
Block访问外部变量
1)Block内部可以访问外部变量;
2)默认情况下,Block内部不能修改外部的局部变量
3)给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。就相当于是全局变量。
总结
block继承了函数指针的便捷性, 也扩展了便捷性。有了block,使得我们在代码块中更加实用,跟OC中的方法直接完美挂钩。
转载高手观点:
在iOS开发中我们在很多地方都能见到block的身影,如:
(1)遍历数组或者字典
(2)视图动画
(3)排序
(4)通知
(5)错误处
(6)多线程
(7)封装变化点 .......
因此,我们了解到Block是OC中的一种数据类型,在iOS开发中被广泛使用,^是Block的特有标记,Block的实现代码包含在{}之间.大多情况下,以内联inline函数的方式被定义和使用,Block与C语言的函数指针有些相似,但使用起来更加灵活, 一个简单的加法,使得block的定义一目了然: