Block:语法块,本质上是匿名函数(没有名称的函数)
标准C里面没有Block,C语言的后期扩展版本,加入了匿名函数
在C++、JS、Swift等语言有类似语法,叫做闭包
Block语法和C语言里的函数指针很相似,下面我们先来回顾下C语言中的函数和函数指针
C语言中函数是指:实现某一功能的代码段
完整的函数包括两部分:函数声明、函数定义
函数声明,即函数原型。例如:int sum (int x,int y);具有两个整形参数,一个整形返回值的函数
函数定义,即函数实现。例如:int sum(int x,int y){
return x + y;
}
函数指针(变量):存放函数地址(函数名)的指针变量
int(*p)(int x,int )= sum;
函数指针类型:int(*)(int x,int y)即:指向两个整形参数,一个整形返回值函数的指针
函数指针变量:p
函数指针的值:sum
Block 匿名函数:没有名称的函数
例如:int (int x,int y)
因为Block是匿名函数,block变量存放的函数的实现,通过block变量能直接调用函数
Block类型:int (^)(int)
Block变量:myBlock
Block值:^int (int num) {return 7*num;}
即:^返回值类型(参数列表){函数体}其中返回值类型可以省略
例如:写一个 返回值为整形 参数为OC字符串(仅一个参数)的block,实现将字符串转换为整形的功能
 int (^myBlock)(NSString *) = ^(NSString *string) {
        return [string intValue];
    };
    NSLog(@"%d",myBlock(@"123"));
block的数据类型代表了匿名函数的格式(返回值类型,形参的类型)
block变量的定义与函数指针变量的定义类似,唯一区别于函数指针变量的是变量名前通过脱字符(^)修饰
首先应该用^修饰,剩余的部分与C语言函数定义一致,最大的不同就是没有函数名(同时返回值类型也可以省略)
block变量在定义时具有变量定义的基本特征,赋值号右侧的匿名函数可以当做一个整体被赋值,类似于 int a = 5;
block变量所赋的值是匿名函数。又兼具函数的特征,并且是唯一可以定义在某个函数实现内部(C语言中认为函数是不能嵌套定义的,block是个特例)
Block进行typedef
typedef int (^BlockType)(int x,int y)
原类型:int(^)(int x,int y)
新类型:BlockType
类比函数指针的类型定义,格式与函数指针一致,类型定义一定程度上简化了block的使用。
    typedef int (^SumType)(int,int);
    SumType sumBlock = ^(int x,int y) {
        return x + y;
    };
    int result = sumBlock(5,4);
    NSLog(@"%d",result);
 
 __block类型标识可以运行局部变量在其后续定义的block内部正常访问,
    __block int num = 0;

void (^testBlock)() = ^() {
        for (int i = 0; i < 10; i++) {
            count++;
            num++;
            NSLog(@"%d",count);
        }

    };
block调用
    testBlock();
 
 
数组使用Block排序
 
数组使用Block对两个字符串进行比较
    NSComparisonResult (^compareBlock)(NSString *,NSString *) = ^(NSString *str1,NSString *str2) {
        return [str2 compare:str1];
//如果是升序返回-1,如果是降序返回1,如果相等返回0
    };
    NSLog(@"%ld",compareBlock(@"11",@"12"));
 
    NSArray *array = @[@1,@2,@13,@12,@23];
    NSArray *resultArray1 = [array sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"%@",resultArray1);
 
数组使用Block排序    降序排列
 
   NSComparator sortBlock = ^(id obj1,id obj2) {
        return [obj2 compare:obj1];
    };
    NSArray *resultArray2 = [array sortedArrayUsingComparator:sortBlock];
    NSLog(@"%@",resultArray2);
 
升序序排列
   NSArray *resultArray3 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2];
    }];
    NSLog(@"%@",resultArray3);
 
 
 

Objective-C中Block语法、Block使用以及通过Block实现数组排序的更多相关文章

  1. OC:Block语法、Block使用、Block实现数组排序

    Block //定义一个求两个数最大值函数 int maxValue (int ,int); //函数的实现 int maxValue (int a, int b){ return  a > b ...

  2. Block 语法

    Block,代码块,^符号是block的语法标记. 比如说,一个block的参数列表是一个UIView,返回值是个CGFloat,block名称是testBlock 可以定义为  CGFloat (^ ...

  3. smarty中的母板极制_extends和block标签

    模板继承 继承是从面向对象编程而来的概念,模板继承可以让你定义一个或多个父模板,提供给子模板来进行扩展. 扩展继承意味着子模板可以覆盖部分或全部父模板的块区域. 继承结构可以是多层次的,所以你可以继承 ...

  4. CUDA中确定你显卡的thread和block数

    CUDA中确定你显卡的thread和block数 在进行并行计算时, 你的显卡所支持创建的thread数与block数是有限制的, 因此, 需要自己提前确定够用, 再进行计算, 否则, 你需要改进你的 ...

  5. NX二次开发-Block UI C++界面关于 在Block UI中UF_initialize();和UF_terminate();的使用

    关于 在Block UI中UF_initialize();和UF_terminate();的使用 用Block UI作NX二次开发的时候,不需要在使用UFUN函数的时候加UF_initialize() ...

  6. Objective C中数组排序几种情况的总结

    总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 数组排 ...

  7. ANTLR4权威指南 - 第6章 尝试一些实际中的语法

    第6章 尝试一些实际中的语法 在前一章,我们学习了通用词法结构和语法结构,并学习了如何用ANTLR的语法来表述这些结构.现在,是时候把我们学到的这些用来构建一些现实世界中的语法了.我们的主要目标是,怎 ...

  8. display:block、display:inline与displayinline:block的概念和区别

    总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...

  9. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

随机推荐

  1. Visual C++ 开发心得与调试技巧

    自己平时收集的一些技巧与心得,这里分享出来,普及一下知识. 1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Releas ...

  2. 获取ks模板文件

    yum install lorax cd /usr/share/doc/lorax-19.6.66 ls rhel7-livemedia.ks rhel7-minimal.ks rhel-atomic ...

  3. WP8_给图片、按钮设置自定义图片

    工程目录下新建文件夹Images,将图片文件复制到Images文件夹里,本文以image1为例 1).在xaml里加背景图片 image图片: <Stretch="Fill" ...

  4. ntfs安全权限和共享权限的区别

    win xp 最大分区32G,最大文件大小4G. 共享权限是为网络用户设置的,NTFS权限是对文件夹设置的. 用户对文件夹有什么权限就是看NTFS权限的设置. 如果一个文件夹设置成共享,其具体的权限还 ...

  5. sql关联excel查询

    select * from 表名 where 字段名 in (SELECT excel列名 FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data S ...

  6. 码农谷 求前N项之和

    题目描述 有一分数序列:2/1.3/2.5/3.8/5.13/8.21/13.......求出这个数列的前N项之和,保留两位小数. 输入描述 N 输出描述 数列前N项和 样例 输入: 输出: 16.4 ...

  7. C\C++ 框架和库整理(转)

    [本文系外部转贴,原文地址:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm]留作存档 下次造轮子前先看看现有的轮子吧 值得学习的C语 ...

  8. Rich控件一

    Calendar控件 Calendar控件用来在Web页面中显示日历中的可选日期,并显示与特定日期关联的数据. 控件声明代码如下: <asp: Calendar id=" Calend ...

  9. centos6.5下yum安装lnmp(适合刚入职的新手的方法)

    新入职的员工,开始的时候都是让配环境,本地写代码用的wamp,在lnmp或lamp测试,除非有些土豪公司 用的是(果机). 另外安装时,把整个流程在脑子里先过一篇(记不全也没关系,一回生二回熟),重在 ...

  10. CentOS学习笔记--系统服务 (daemons)

    系统服务 (daemons) 系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称为 service . 但是 service 的提供总是需要程序的运行吧!否则如何运行呢? ...