http://blog.csdn.net/nicktang/article/details/6906352

本章的几节使用例子代码来开始块代码的学习。

定义和使用块代码

插入符^有两个作用,一个是声明一个块代码变量,另一个是开始一个块代码的定义。块代码的代码部分是包含在一对大括号中的,就像下面演示的这样(使用C语言风格的分号;作为块代码行的结束):

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};

下图是对块代码的详细演示:

主义块代码中可以使用和它有同一个生存域的变量的。

如果你声明了一个块代码变量,你可以在后面像使用函数一样使用它:

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};
 
printf("%d", myBlock(3));
// prints "21"

直接使用块代码

很多情况下,你不需要声明块代码变量,你把一个块代码直接做内联实现,然后作为函数参数传入函数。下面的例子使用函数qsort_bqsort_b和函数qsort_r很像,不过它使用一个块代码作为参数。

char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };
 
qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
    char *left = *(char **)l;
    char *right = *(char **)r;
    return strncmp(left, right, 1);
});
 
// myCharacters is now { "Charles Condomine", "George", "TomJohn" }

Cocoa中的块代码

Cocoa框架中有不少函数是使用块代码作为参数的,特别是在容器类中的包含对象的操作,或者一个操作完成后的回调函数。下面的例子演示了在NSArray类中的sortedArrayUsingComparator:函数中使用块代码,这个函数仅有一个参数,就是这个块代码,为了演示,块代码被声明为NSComparator类型的本地变量:

NSArray *stringsArray = [NSArray arrayWithObjects:
                                 @"string 1",
                                 @"String 21",
                                 @"string 12",
                                 @"String 11",
                                 @"String 02", nil];
 
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
        NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSLocale *currentLocale = [NSLocale currentLocale];
 
NSComparator finderSortBlock = ^(id string1, id string2) {
 
    NSRange string1Range = NSMakeRange(0, [string1 length]);
    return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
};
 
NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];
NSLog(@"finderSortArray: %@", finderSortArray);
 
/*
Output:
finderSortArray: (
    "string 1",
    "String 02",
    "String 11",
    "string 12",
    "String 21"
)
*/

__block类型变量

块代码的一个更强力的功能是可以修改具有同一可视周期的变量。当然你必须使用__block来修饰这个变量。考虑上节中的例子,如果我们需要使用一个变量来做一个统计,就像下例一样。这里的currentLocale变量对于代码块内部而言就是只读的。

NSArray *stringsArray = [NSArray arrayWithObjects:
                         @"string 1",
                         @"String 21", // <-
                         @"string 12",
                         @"String 11",
                         @"Strîng 21", // <-
                         @"Striñg 21", // <-
                         @"String 02", nil];
 
NSLocale *currentLocale = [NSLocale currentLocale];
__block NSUInteger orderedSameCount = 0;
 
NSArray *diacriticInsensitiveSortArray = [stringsArray sortedArrayUsingComparator:^(id string1, id string2) {
 
    NSRange string1Range = NSMakeRange(0, [string1 length]);
    NSComparisonResult comparisonResult = [string1 compare:string2 options:NSDiacriticInsensitiveSearch range:string1Range locale:currentLocale];
 
    if (comparisonResult == NSOrderedSame) {
        orderedSameCount++;
    }
    return comparisonResult;
}];
 
NSLog(@"diacriticInsensitiveSortArray: %@", diacriticInsensitiveSortArray);
NSLog(@"orderedSameCount: %d", orderedSameCount);
 
/*
Output:
 
diacriticInsensitiveSortArray: (
    "String 02",
    "string 1",
    "String 11",
    "string 12",
    "String 21",
    "Str\U00eeng 21",
    "Stri\U00f1g 21"
)
orderedSameCount: 2
*/

这个内容在“Blocks and Variables”中有更多细节描述。

块代码编程---开始使用块代码相关推荐

  1. c语言 源程序代码,编程(C语言源程序代码)

    编程(C语言源程序代码) 已知 S=1+1/(1+2)+1/(1+2+3)+-+1/(1+2+3+-+N) ,当N的值为50时,求S的值. 要求:按四舍五入的方式精确到小数点后第四位. #includ ...

  2. python代码编程教学入门,python代码编程火影忍者

    python源代码编程软件 编写python源代码的软件.首推的Pycharm. PyCharm用于bai一般IDE具备的功能,比如, 调试.语法高亮.Project管理.du代码跳转.智能提示.自动 ...

  3. java range(10)_Java 中的十个 ” 单行代码编程 ” ( OneLiner )

    原标题:Java 中的十个 " 单行代码编程 " ( OneLiner ) 作者:飒然Hang 原文链接:www.rowkey.me/blog/2017/09/09/java-on ...

  4. 无代码编程时代下,程序员要失业了?

    作者 | Phodal 责编 | 伍杏玲 [CSDN 编者按]"中台之后,便是无代码编程."无代码编程是什么?开发流程是怎么样的?有何优缺点? 无代码编程时代来了,就不需要程序员编 ...

  5. 敲代码括号技巧_理解代码块概念,养成良好编程习惯 | 亲子课堂 第 3 课

    亲子课堂 关卡解析 / 英语教学 / 编程讲解 做亲子编程教育的好帮手! 每周二.四定期更新 地牢 面向真正0编程基础的孩子们,关卡被设计成迷宫的形式,引导孩子们使用编程思维解决问题. 以循序渐进的方 ...

  6. 一文带你深入理解【Java基础】· 面向对象编程(下)②代码块、final和abstract

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  7. Java 编程下的同步代码块

    为了便于理解先来看看没有加同步代码块的 2 组同样功能的代码在不同状态下的执行结果,下面看第一组: package cn.wangjwei.synchronize;public class Synch ...

  8. 存储过程可重用的代码块_如何使您的代码可重用

    可重用代码不是通用代码 Image Credits: Pixabay.com 可重用的代码作为解决所有软件问题的一站式解决方案,是一个危险的神话. 让我解释一下原因. 假设您正在编写软件库. 您脑中冒 ...

  9. 利用有穷自动机去除C语言代码行注释(//)以及块注释(/* */)

    一. 程序设计题目与说明 利用有穷自动机去除C语言代码行注释(//)以及块注释(/* */) 该有穷自动机的状态转换图如下: 二. 核心代码(或全部代码) #include<stdio.h> ...

最新文章

  1. InfluxDB:cannot use field in group by clause
  2. ACM思维题训练 Section A
  3. Xampp配置本地域名及常见错误解决
  4. Matlab——对比度拉伸
  5. 每天学一点flash(76)百度MP3音乐APi接口使用
  6. c# 多线程单例模式_线程安全C#单例模式
  7. Linux系统,Hadoop,R语言,RHadoop的安装
  8. 取代奶瓶Minidwep-gtk破解WPA 全攻略
  9. PSM模型(价格敏感测试模型)
  10. windows7桌面计算机作用,win7系统虚拟桌面功能的详细教程
  11. JavaScript的BOM(浏览器对象模型)部分知识点与DOM(文档对象模型)
  12. Day 3 Linux(目录篇 、文件操作篇 、压缩解压相关命令, 编辑器vi 、编译器gcc 、调试器gdb、 makefile工程管理器初学)
  13. 深度相机介绍(TOF、RGB双目、结构光参数对比)
  14. 深度学习框架PyTorch入门与实践:第九章 AI诗人:用RNN写诗
  15. 剑灵系统推荐加点_新版剑灵怎么加点(2019剑灵技能加点在哪里)
  16. poi读取excel多层表头模板写入数据并导出
  17. VBA生成和为定值的随机数
  18. pycharm 选中多行,点back space键无法删除
  19. IT小天个人技术博客
  20. hiho #1474 : 拆字游戏(dfs)@

热门文章

  1. 大学计算机二级培训新闻稿,计算机二级模拟考通讯稿
  2. php null运算符,PHP7 Null合并运算符
  3. Python入门系列之字符编码
  4. jmeter中没有sampler_JMeter 接口自动化测试篇 29
  5. 简单介绍python迭代器和生成器
  6. java 路径 工具类,java 绝对路径工具类
  7. C语言中的关键字详略
  8. 关于学习Python的一点学习总结(14->换一种方法创建字典->访问字典)
  9. PTA基础编程题目集-6-13 折半查找
  10. Prime Path(bfs)广度优先搜索