Block是OC中一种与其它语言的语法区别较大的一种用法,需要注意:

  • Block也叫代码段,它封装了一段代码,可以在任何时候执行;
  • Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值;
  • 它和传统的函数指针很类似,但也有区别:block是inline(内联函数)的,并且默认情况下它对局部变量时只读的;
  • Apple建议尽量多使用block;
  • 在多线程、异步任务、集合遍历、集合排序、动画转场中用的较多。

  Block有两种使用方法:

  1.直接定义一个block

    // 定义了一个block,这个block返回值是int类型,接收两个int类型的参数
int (^Sum) (int, int) = ^(int a, int b) {
return a + b;
};
//调用block
int a = Sum( ,); NSLog(@"%i", a);

  2.先用typedef定义block类型,再用该block类型定义具体的block

typedef int (^Oper) (int, int);

int main(int argc, const char * argv[])
{
@autoreleasepool {
//声明了一个block变量,做加法功能
Oper add = ^(int a, int b) {
return a + b;
};
NSLog(@"%i", add(, )); //声明了一个block变量,做减法功能
Oper sub = ^(int a, int b) {
return a - b;
}
NSLog(@"%i", sub(, )); }
return ;
}

  这样使用更具灵活性,可以定义一类操作类型,再利用这种操作类型定义具体的操作,比如我还可以继续定义乘法和除法的block。

  Block可以访问局部变量,但是不能改变它,如果需要修改,需用__block作特殊声明:

    // __block有2个下划线
__block int c = ;
// 声明了一个block变量
Oper add = ^(int a, int b) {
// 如果外部的变量用了__block关键字,就可以在block内部修改这个变量
c = ;//如果不加__block声明,这句会报错,只能打印c的值
// block可以访问外面定义的变量
NSLog(@"c is %i", c);
return a + b;
};

Objective-C:Block的更多相关文章

  1. block没那么难(二):block和变量的内存管理

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着 ...

  2. block没那么难(一):block的实现

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> block 顾名思义就是代码块,将 ...

  3. iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)

    iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)   使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: ...

  4. Block高级用法:Block传值UI_12(3)

    1.简单复习Block的定义.赋值.调用做学习传值铺垫: //声明一个函数 无返无参void printfHello(int a);//函数的实现void printfHello(int a){    ...

  5. 环境变量、block、修饰符:block对环境变量的引用和修改需要通过修饰符来限定

    环境变量.block.修饰符:block对环境变量的引用和修改需要通过修饰符来限定. http://www.cnblogs.com/fengmin/p/5816580.html - (NSUInteg ...

  6. <div>里用display:block有用么?

    对所有的块元素都没有意义,块元素的dispaly属性默认值为block,没必要再显式定义--除非你之前对块元素的display属性重新定义过. =========================== ...

  7. display:block什么时候使用

    所有的块级元素不需要再在使用display:block定义,块级元素本身的默认属性就是block display:block:比较常用于<a><span>这两个标签,因为他们不 ...

  8. display:block inline-block inlined的区别

    一.首先要了解什么是块级元素与行级元素 块级元素 会占领页面的一行,其后多个block元素自动换行. 可以设置width,height,设置了width后同样也占领一行.同样也可以设置   margi ...

  9. CSS基础:block,inline和inline-block

    css的display属性是前端开发中非常常见的属性,本文简单介绍下其中比较常用的属性值,即block.inline和inline-block. HTML组件中呈现一片空白区域的组件都可当盒模型(bo ...

随机推荐

  1. sqlserver前面加N解释

    From : http://lzde360.blog.163.com/blog/static/6780720820111026112033917/ 加上 N 代表存入数据库时以 Unicode 格式存 ...

  2. Codeforces Round #375 (Div. 2) D. Lakes in Berland dfs

    D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. poj 2985 The k-th Largest Group 树状数组求第K大

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted ...

  4. C#开发Activex控件(1)

    项目结构 创建Activex步骤: 1.选择创建类别(Windows 控件库或类库) 2.设置对应的com属性 AssemblyInfo.cs中须做以下设置:a.引入命名空间:using System ...

  5. iOS - Swift Swift 语言新特性

    1.Swift 2.0 带来哪些新变化 常规变化: 1.OS X 10.11.iOS 9 和 watchOS 2 SDK 采纳了一些 Objective-C 的特性用来提高 Swift 的编程体验, ...

  6. Android 呼吸灯流程分析

    一.Android呼吸灯Driver实现 1.注册驱动 代码位置:mediatek/kernel/drivers/leds/leds_drv.c 602static struct platform_d ...

  7. odoo中pos模块由于删除partner导致发生(你试图访问的单据已经删除)错误的解决方法

    model.js文件中 push_order: function(order) { var self = this; if(order){ this.proxy.log('push_order',or ...

  8. (三)ubuntu学习前传—uboot常见环境变量

    1.环境变量如何参与程序运行(1)环境变量有2份,一份在Flash中,另一份在DDR中.uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR ...

  9. ElasticSearch(ES)和solr的关系和区别

    可以参考这篇文章:http://www.cnblogs.com/chowmin/articles/4629220.html Solr 2004年诞生(当时是Solar). ElasticSearch ...

  10. 提高iOS开发效率的第三方框架等

    http://zhangmingwei.iteye.com/blog/2208783 http://www.kuqin.com/shuoit/20150703/346900.html