主要内容:Block(Block语法、Block使用、Block实现数组排序)
一、Block语法
Block:块语法、本质上是匿名函数(没有函数名称的函数),和函数指针很相似
函数回顾:
实现了某一功能的代码块的封装,(函数声明、函数定义、函数调用三步)
函数指针回顾:
函数指针(变量):存放函数地址(函数名)的指针变量
int ( *p ) ( int x , int y ) = sum
函数指针类型:int ( * ) ( int x , int y) ,即指向两个整型参数,一个整型返回值函数的指针
函数指针变量:p,函数指针的值:sum
Block:
注意:
1、最后的 “ ; ” 必须写
2、参数的变量名不能省略
3、block赋的值就是一个匿名函数
匿名函数:没有名称的函数
Block语法:如图所示
详解:
Block类型:int (^) int
Block变量:myblock
Block值:^( int sum ) { return 7 * sum ; } ;
即:^返回值类型 (参数列表) { 函数体 }(返回值类型可以省略)
二、Block的使用
示例:
写一个返回两个整型数据和的Block块
int (^sum) (int , int ) = ^(int x , int y) {
return x + y ;
}
int a = sum(20 , 10 ) ; / / 调用block函数
写一个求最大值的block
int (^maxBlock) (int , int ) = ^(int x , int y){
return x > y ? x : y ;
}
对block进行typedef
typedef int (^sumBlock) (int x , int y) ;
新类型:sumBlock
原类型:int (^) (int , int)
等价与:sumBlock ^sum2 = ^(int x , int y){
return x + y ;
}
三、block与局部变量和全局变量
block块内部可以使用外部变量
对于全局变量来说:可读可写
对于局部变量来说:可读、不可写,如果想要改变局部变量的值,需要在局部变量前面前面加 __block 进行修饰
示例:
Block与局部变量
Block与全局变量:
三、Block与数组排序
示例:
对Student对象排序
Student *stu1 = [ Student StudentWithName : @"xiaoming" , age : 21 ] ;
Student *stu2 = [ Student StudentWithName : @"" , age : ] ;
NSMutableArray *mu = [ NSMutableArray arrayWithObjects : stu1 , stu2 , nil ] ;
mu sortUsingcomparator : ^NSComparionResult(id obj1 , id obj2){
if ( [obj1 getAge] > [obj2 getAge]) {
return NSOrderedDescending ;
} else if ( [obj1 getAge] < [obj2 getAge] ) {
return NSOrderedAscending ;
} else {
return NSOrderedSame ;
}
}
四、字面量
字面量是一种新型的写法,能在一定程度上简化代码
注意:字面量创建的对象是变量构造的,并且是不可变的