主要内容:

⼀、Block语法

⼆、Block使⽤

三、Block实现数组排序

Block简介

Block:块语法,本质上是匿名函数(没有名称的函数)

标准C⾥面没有Block,C语⾔言的后期扩展版本,加⼊了匿名函数。

C++、JS、Swift等语⾔,有类似语法,叫做闭包。 Block语法和函数指针很相似。

回顾函数指针

函数指针(变量):存放函数地址(函数名)的指针变量。

int (*p)(int x,int y) = sum;

函数指针类型:int (*)(int x,int y) 即:指向 两个整型参数,一个整型返回值函数的指针。

函数指针变量:p

函数指针的值:sum

Block

匿名函数:没有名称的函数。

例如 int (int x, int y)

因为Block是匿名函数,block变量存放的函数的实现,通过block变量能直接调⽤用函数

没有名称的函数应该如何调⽤用?(有名称的话,可以直接调⽤,也可以通过函数指针来调⽤用)

//1. ^ :脱字符
//在OC 语言中, '^'表示Block块 //声明一个block 变量
int (^sumBlock) (int, int) = ^(int a, int b){
return a+b;
};
NSLog(@"%d",sumBlock(,));
 int (^maxBlock)(int , int ) = ^(int a, int b){
return a > b ? a:b;
};
int a = maxBlock(,);
NSLog(@"%d",a);

Block返回值类型:int (^maxBlock)(int a, int b)  a,b可以不写

Block变量:a, b

Block变量存储的值:是实现部分

即: ^返回值类型 (参数列表)    函数体

Block 进行typedef

typedef in (^BlockType)(int x, int y)

原类型: int (^)(int x, int y)

新类型: BlockType

//给Block类型起一个别名
typedef int (^MaxBlock) (int, int);
MaxBlock sumBlock1 =^(int a, int b){
return a + b;
};
NSLog(@"%d",sumBlock1(,));

Block与局布变量的关系

//Block 与局部变量的关系

   // int abc = 897;  //局部变量

   //__block修饰后 可以修改局部变量
__block int count = ;
void (^sayHi) (int) = ^(int c){
for (int i = ; i < count; i++) {
NSLog(@"嗨");
}
// abc = 90; //可以使用局部变量,不可修改局部变量 };
sayHi();

Block与局布变量的关系

//全局变量
int count = ;
int main(int argc, const char * argv[])
{
//Block 与全局变量
void (^addNum)(void) = ^(void){
count++;
NSLog(@"count = %d",count);
};
//调用
addNum();
//显示结果
NSLog(@"count = %d",count);
//练习1 用Block实现将字符串转为整形的功能
int (^strint) (NSString *) = ^(NSString *string){
return [string intValue];
};
int num = strint(@"");
NSLog(@"%d",num);

Block数组排序

 //block数组排序
NSArray *stringArray = [ NSArray arrayWithObjects:@"a18",@"",@"",@"", nil]; NSComparator sortBlock = ^(id string1, id string2){
return [string1 compare:string2];
};

//将Block作为参数传递给方法

    NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
NSLog(@"sortArray:%@",sortArray);
  //使用Block给动态数组进行排序 //不可变数组用法二需要在前面接收一下
NSMutableArray *ageArray = [ NSMutableArray arrayWithObjects:@"", @"", @"", nil];
//法一
NSComparisonResult (^sortBlock) (id, id) = ^(id obj1, id obj2){
if ([obj1 intValue] > [obj2 intValue]) {
return NSOrderedDescending ;
}else if([obj1 intValue] < [obj2 intValue]){
return NSOrderedAscending;
}else{
return NSOrderedSame;
}
};
//将Block作为参数传递给方法
[ageArray sortUsingComparator:sortBlock];
NSLog(@"%@", ageArray);
//法二 (使用这种方法)
[ageArray sortUsingComparator:^NSComparisonResult(id obj3, id obj4) {
if ([obj3 intValue] > [obj4 intValue]) {
return NSOrderedAscending;
}else{
return NSOrderedSame;
}
}];

1. 创建Person类

    实例变量: _name    _age


    方法:初始化方法


               便利构造器


               实例变量的赋值、取值方法


2. 创建3个Person对象,放入数组中


3. 在Person中添加compareByName:方法,使用此方法对数组进行排序,并输出


4. 使用Block根据Person的age进行排序,并输出

//根据age排序
Person *person1 = [ Person personWith:@"da" age:];
Person *person2 = [Person personWith:@"ji" age:];
Person *person3 = [Person personWith:@"ko" age:];
NSMutableArray *array = [NSMutableArray arrayWithObjects:person1,person2,person3, nil];
[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ([obj1 getAge] > [obj2 getAge]) {
return NSOrderedDescending;
}else {
return NSOrderedSame;
}
}];
NSLog(@"%@",array);

字面量

OC 06 Block、数组高级的更多相关文章

  1. OC语言Block 续

    OC语言 Block 转载:http://blog.csdn.net/weidfyr/article/details/48138167 1.Block对象中的变量行为 结论: 在block代码块内部可 ...

  2. Oc中的数组

    ========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...

  3. OC语言BLOCK和协议

    OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似 ...

  4. 李洪强iOS开发之OC语言BLOCK和协议

    OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么? 苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相 ...

  5. OC基础 可变数组与不可变数组的使用

    OC基础 可变数组与不可变数组的使用 1.不可变数组 1.1不可变数组的创建 //实例方法 NSArray *array = [[NSArray alloc] initWithObjects:&quo ...

  6. OC语言-block and delegate

    参考博客 OC语言BLOCK和协议 iOS Block iOS Block循环引用精讲 iOS之轻松上手block 深入浅出Block的方方面面 Block apple官方参考 1.定义一个block ...

  7. OC语言Block

    OC语言Block 一.Block (一)简介  Block是什么?苹果推荐的比较特殊的数据类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. Block和 ...

  8. C#高级编程(第9版) 第06章 数组

    好久没发东西了 , 一停下来就会变懒.... 虽然没完成,也就是它吧 --------------------------------- 以下正文 -------------------------- ...

  9. iOS开发-OC语言 (四)数组

    知识点 1.NSArray 2.NSMutableArray 1.数组的基本用法: 2.数组的遍历 3.数组排序 ===========   NSArray  不可变数组  ============= ...

随机推荐

  1. HTML5 不再支持哪些元素

    HTML5中已经不支持以下的元素,不建议在进行开发时再使用以下的元素. 1.acronym(建议abbr):定义首字母缩写 2.applet(建议object):定义applet 3.basefont ...

  2. Oracle数据库中心双活之道:ASM vs VPLEX

    Oracle数据库中心双活之道:ASM vs VPLEX 来源 https://www.cnblogs.com/wenjiewang/p/7460212.html 双活方案对比:ASM vs V-PL ...

  3. 【刷题】BZOJ 3175 [Tjoi2013]攻击装置

    Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照"日"字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1), ...

  4. [洛谷P2106]Sam数

    题目大意:问长度为$n$的$Sam$数有几个,$Sam$数的定义为没有前导零,相邻两个数字之差绝对值小于等于$2$的数 题解:发现转移方程一定,可以矩阵快速幂. 卡点:没有特判$n=1$的情况 C++ ...

  5. UVA.297 Quadtrees (四分树 DFS)

    UVA.297 Quadtrees (四分树 DFS) 题意分析 将一个正方形像素分成4个小的正方形,接着根据字符序列来判断是否继续分成小的正方形表示像素块.字符表示规则是: p表示这个像素块继续分解 ...

  6. Java中equals和==的区别?为什么重写equals方法后,一定要重写hashCode方法?

    首先明确一点,equals是方法,==是操作符. 1. 如果比较的是基本数据类型: 只讨论==,因为equals是不存在的,因为java中基本数据类型不能调用method的. 2. 如果比较的是引用类 ...

  7. HDU1828线段树(扫描线)

    Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. mysql concat update中拼接字符串

    mysql> select id,avatar from tf_user; +----+--------------+ | id | avatar | +----+--------------+ ...

  9. js获取当前页面的参数,带完善~~~

    let url = window.location.href; let id = url.slice(url.indexOf('?') + 4);

  10. 【HDU】6148 Valley Numer 数位DP

    [算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...