block,代理delegate,kvc等的学习总结

27 阅读4分钟

#import <Foundation/Foundation.h>

#import "Student.h"

typedef int(^BlockType)(int,int);

int globalVariable = 200;

int main(int argc, const char * argv[])

{

    @autoreleasepool {

        /*

         Block学习:初级block,关于高级block将在UI阶段

         关于block语法,参考其他资料

         作用:

         Block封装了一段代码,可以在任何时候执行

         Block可以作为函数参数或者函数的返回值,而本身又可以带输入参数或返回值

         block,在多线程、异步任务,集合遍历,集合排序、动画专场用得多

         */

        

        //int (int a,int b)表示匿名函数的类型

        //int (^ )(int a,int b)表示Block的类型

        //myBlock实现的是匿名函数的实现体部分

        int (^ myBlock)(int a ,int b) =^int(int a ,int b){

            return a+b;

        };//这里需要加分号,因为这整个部分相当于一个赋值语句,大括号内容赋值给块变量myBlock

        

        //按照调用函数的方式调用块对象

        int value =   myBlock(3,5);//通过myBlock实现两个整型数的求和,返回值为int

        

        NSLog(@"%d",value);

        

        

//写⼀个 返回值为整型 参数为NSString(仅⼀一个参数)的block,实现将字符串转换为整型的功能.

        int (^strBlock)(NSString *str)=^int(NSString *str){

          int value =[str intValue];

          return value;

         };

        NSString *str = @"123";

        //使用block

        NSLog(@"%d",strBlock(str));

        

//练习,定义三个block求商/差/积

        int (^cutBlock)(int ,int )=^int(int a,int b){

            return a-b;

        

        };

        int (^dealerBlock)(int ,int)= ^(int a,int b){

            return  a%b;

        };

        int (^rideBlock)(int,int ) = ^(int a,int b){

            return a*b;

        };

        NSLog(@"%d",cutBlock(3,5));

        NSLog(@"%d", dealerBlock(3,5));

        NSLog(@"%d",rideBlock(3,5));

        

       //对于上面三个函数的类型都一样,所以可以引入typedef来在#import下面进行重定义

#pragma mark----给相同block类型进行重命名

        BlockType myBlock1 = ^int(int a,int b){//对于^后面的int可以省略,但是系统默认的是int型,所以如果是其他类型一定要写上

            return a-b;

        };

        NSLog(@"%d",myBlock1(4,5));

        //.....

        

#pragma mark----block与全局变量  

    //定义一个全局变量globalVariable

        void (^block)(void) = ^(){//^(void)(),前面的返回值类型void可以省略,但是后面的括号语法上定义是不可以省略(),但是经过测试没有参数也可以省略

            globalVariable++;//如果是全局变量可以直接被访问和修改

            NSLog(@"%d",globalVariable);

        };

        block();

        

#pragma mark----block与局部变量

       // int number =1;//局部变量需要加__block,否则会提示出错

      __block  int  number = 1;

        void (^block1)(void) = ^(){

            number++;//如果是局部变量不可以直接被访问和修改,必须在number前面加一个__block,这里需要打两个小_

            NSLog(@"%d",number);

        };

        block1();

        

#pragma mark----block自动截取变量

        int val = 10;

        void (^blk)(void) = ^(){

           // printf("val=%d\n",val);

            NSLog(@"%d",val);

        };

        val = 2;

        blk();

        

//上面这段代码,输出值是:val = 10.而不是2.block截获自动变量的瞬时值。因为block保存了自动变量的值,所以在执行block语法后,即使改写block中使用的自动变量的值也不会影响block执行时自动变量的值。

    

        

#pragma mark----block与数组排序

        //关于数组的排序已经总结过,这里做一个比较

//使用系统自带compare比较系统自带对象

        NSArray *strsArray =[NSArray arrayWithObjects:@"abc",@"cdf",@"ade",@"feg", nil];

        NSArray *newArray = [strsArray sortedArrayUsingSelector:@selector(compare:)];

        NSLog(@"%@",newArray);

        

//使用block方式比较系统自带对象

        //该种方式是按block的语法按步骤来进行比较的,下面背注掉的是使用简便的方式,两者原理一样

        NSComparisonResult(^strBlock1)(id obj1,id obj2)=^NSComparisonResult(id obj1,id obj2){

            NSString *result1 = (NSString *)obj1;

            NSString *result2 = (NSString *)obj2;

            return [result1 compare:result2];

        };

        NSArray *resut3 = [strsArray sortedArrayUsingComparator:strBlock1];//strBlock1

        NSLog(@"%@--",resut3);

    

//       NSArray *sortArray = [strsArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {^NSComparisonResult(id obj1, id obj2)相当于上面的strBlock1

//           NSString *result1 = (NSString *)obj1;

//           NSString *result2 = (NSString *)obj2;

//           return [result1 compare:result2];

//        }];

//        NSLog(@"%@",sortArray);

        

        

        //对于系统自带的对象和类都可以用compare方法,但是自定义的类需要自己重写compare方法

        //使用自定义compare方法对数组中得对象按照年龄进行排序,(数组中的对象为自定义类型的对象)

        Student *stu1 = [Student studentWithName:@"刘亦菲" Age:26 Score:89.0];

        Student *stu2 = [Student studentWithName:@"张飞" Age:34 Score:78.0];

        Student *stu3 = [Student studentWithName:@"周冬雨" Age:22 Score:85.0];

        NSMutableArray *stusarray = [NSMutableArray arrayWithObjects:stu1,stu2,stu3 , nil];

        [stusarray sortUsingSelector:@selector(studentCompare:)];

        for (NSString * str in stusarray) {

            NSLog(@"%@",str );

        }

        

//使用block方式对数组中得对象按照年龄进行排序,(数组中的对象为自定义类型的对象)

        [stusarray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {

            Student *stu1 = (Student *)obj1;//强制转换成自定义类型

            Student *stu2 = (Student *)obj2;

            return  [stu1 studentCompare:stu2];

            

        }];

        for (NSString *stri in stusarray) {

            NSLog(@"%@",stri);

        }

        

 //使用自定义的block实现对数组中的对象进行排序,基本处理方式与上述的处理系统对象相似,只是如果不知道参数类型必须进行强制转换

       NSComparisonResult(^stuBlock)(id ob1,id ob2) =^ NSComparisonResult(id ob1,id ob2){

        Student *stud1 = (Student *)ob1;//强制转换

        Student *stud2 = (Student *)ob2;

           return [stud1 studentCompare:stud2];

       };

        [stusarray sortUsingComparator:stuBlock];//调用自定义块

        for (NSString *stri in stusarray) {

            NSLog(@"%@",stri);

        }

        return 0;

}

1.由浅至深的学习block

www.cocoachina.com/ios/2016041…

2.代理,block传值

www.360doc.com/content/15/…

3.Protocol协议及委托代理(Delegate)传值

www.cocoachina.com/ios/2015011…

4.delegate,block,通知的区别

blog.csdn.net/u010958446/…