首页 > 代码库 > OC第六课

OC第六课

主要内容: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 ;

                            }

              }

四、字面量

        字面量是一种新型的写法,能在一定程度上简化代码

        注意:字面量创建的对象是变量构造的,并且是不可变的



OC第六课