1.函数指针和Block均可以实现回调的操做,声明上也很类似,实现上均可以当作是一个代码片断。 函数
2.函数指针类型和Block类型均可以做为变量和函数参数的类型。(typedef定义别名以后,这个别名就是一个类型)指针
1.函数指针只能指向预先定义好的函数代码块(能够是其余文件里面定义,经过函数参数动态传入的),函数地址是在编译连接时就已经肯定好的。 调试
2.Block本质是Objective-C对象,是NSObject的子类,能够接收消息。 对象
3.函数里面只能访问全局变量,而Block代码块不光能访问全局变量,还拥有当前栈内存和堆内存变量的可读性(固然经过__block访问指示符修饰的局部变量还能够在block代码块里面进行修改)。 生命周期
4.从内存的角度看,函数指针只不过是指向代码区的一段可执行代码,而block其实是程序运行过程当中在栈内存动态建立的对象,能够向其发送copy消息将block对象拷贝到堆内存,以延长其生命周期。 关于第2点能够做一个实验,在定义block以后打一个断点,Cmd+R运行后,能够在调试窗口看到,block确实是一个对象,拥有isa指针。 另外,采用block写法,gcc编译出来可执行文件体积更大,这应该仍是跟block是对象有关。内存