OC中Block语法、Block使用以及通过Block实现数组排序

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);

时间: 2024-10-03 14:55:36

OC中Block语法、Block使用以及通过Block实现数组排序的相关文章

QF——OC中把方法当做参数传递的两种形式(@selector和block)

@selector(): 可以理解@selector()就是取类方法的编号,他的基本行为等同于C语言中的函数指针(指向函数的指针).它们通过传递方法的地址(或编号)来实现把方法当做参数的效果. 不过在C语言中,可以直接把一个函数名赋给一个函数指针,但是在OC中不行,而是要通过@selector语法来取.它的括号里传入的是方法名,返回结果是 SEL类型,该类型本质上就是方法的编号(地址). block: block,名为代码块.它和函数很相似,有返回值,有名称,有参数列表. 格式: 返回值类型 (

OC中分类、类扩展、Block、协议(由协议引出的代理模式)

一: 分类(Category) 1>Category的概念:就是在不改变原来类的基础上,为类增加一些方法 (1,可以为库中定义的类增加方法:2,可以给自己定义的类增加方           法)仅仅是方法哦 好处:一个类可以有多个文件,编译器会将这些文件按一个类除了,便于团队合作. 2> 代码格式: 自定义类中加分类 Person类 #import "Person.h" @interface Person : NSObject - (void)sayHi; @end @im

OC中NSString和block的属性时copy,而不用retain

OC中NSString和block的属性时copy,而不用retain   而容器类使用retain NSString 为什么要使用copy,而不是retain 1.首先如果使用retain,只是引用计数+1,并没有生成新的对象,所以效率好 2.但是使用copy安全.因为NSString为NSMutableString 的基类,如果将NSMutableString 以retain的形式赋值给NSString后,后续修改NSMutableString会导致NSString内容的变化,这通常不是我们

oc中的block

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //block的规则 //返回值类型(^block名称)(形参参数列表)一般形参变量名不用写= ^返回值类型(实参数列表){block体}; // int (^block3)(int) = ^(int)(int x){ return 101;}; //int result=block(3);调用 //注意要

从C语言的变量声明到Objective-C中的Block语法转载]

原文:From C Declarators to Objective-C Blocks Syntax 作者:Nils Hayat 译者:CocoaChina--sunshine 在这篇文章中,从简单的C语言中各种声明开始,以及复杂的声明组合,到最后Objective-C中的代码块bokck的语法. 花一些时间去了解代码块(block)衍生和组织形式,一旦明白了这些,就可以很方便的声明和使用它,而不用每次需要的时候才去Google一下. 如果你想把能想到的东西用block声明表现出来,请继续阅读!

OC --(6)-- Block、数组高级:Block语法、Block使用、Block实现数组排序

1.Block定义 Block:块语法,本质上是匿名函数(没有名称的函数) 标准C?里?面没有Block,C语言的后期扩展版本,加入了匿名函 数. C++.JS.Swift等语?言,有类似语法,叫做闭包. Block语法和函数指针很相似.

swift中闭包 OC中Block 解决循环引用

OC 中 全局宏定义 #define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self; 用法如下: WS(weakself) [self.tableView addHeaderWithCallback:^{ [weakself requestMemberList]; }]; swift 在比闭包 中使用 weakSelf weak var weakSelf = self demo4 {     // 使用?的好处 就是一旦 self 被释

OC 中的block存储位置

一.block块的存储位置(block块入口地址):可能存放在2个地方:代码区.堆区(程序分5个区,还有常量区.全局区和栈区). 详细介绍: 情况1:代码区 不访问处于栈区的变量(例如局部变量),且不访问处于堆区的变量(例如alloc创建的对象).也就是说访问全局变量也可以. /** 没有访问任何变量 */ int main(int argc, char * argv[]) { void (^block)(void) = ^{ NSLog(@"==="); }; block(); }

黑马程序员-OC加强学习日记-分类、协议、block类型

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.分类  Gategroy 1.创建一个分类 @interface  类名 (分类名) @end @implementation 类名 (分类名) @end 2.特点:(1)扩展已有类的功能 (2)分类中可以访问原有类的成员变量(定义在头文件中的成员变量) 3.语法步骤:(1)创建一个分类 (2)在分类中增加新方法的声明和实现 4.注意点:(1)分类不可以为原有类增加定义成员变量, @prop