进击的KFC:OC(六)Block

pragma mark ——– Block语法

一.Block的定义:
Block:块语法,本质上是匿名函数(没有名称的函数).Block语法和函数指针很相似。

课程回顾:函数

函数:C语⾔中,实现某⼀功能的代码段。
完整的函数包含两部分:函数声明、函数定义
函数声明,即函数原型。例如:int sum(int x,int y);具有两个整型参
数,⼀个整型返回值的函数。
函数定义,即函数实现。例如:
     int sum(int x,int y){
     retrun x + y;
   }

课程回顾:函数指针:

函数指针(变量):存放函数地址(函数名)的指针变量。
int (*p)(int x,int y) = sum;
函数指针类型:int (*)(int x,int y) 即:指向 两个整型参数,⼀个整
型返回值 函数 的指针。
函数指针变量:p
函数指针的值:sum

Blcok语法;
这里写图片描述
Block详细:
1.Block 标志:^
2.Block保存的是:有特定功能的函数体
3.数据类型 + 变量名 = 初值;
4.初值部分 是一个没有名字的 函数体 并且类型与Block类型相同
5.匿名函数就是函数 其函数中定义的变量,存在栈区

pragma mark ——– Block的使用

实例:

// 写⼀个 返回值为整型 参数为NSString(仅⼀个参数)的block,实现将字符串转换为整型的功能
    NSInteger (^blockReturnInt)(NSString *str) = ^NSInteger (NSString *str){        
        NSInteger result = [str intValue];
        return result;
    };   
    NSLog(@"%ld",blockReturnInt(@"KFC"));

Block进⾏typedef

typedef NSInteger (^MyBlock)(NSString *str)
原类型:NSInteger (^)(NSString *str)
新类型:MyBlock
以后创建新的Block可以这样写: MyBlock block2 = ^NSInteger(NSString *str){
  NSInteger result = [str intvalue];
  return result; 
};
                    Block与局部变量:

这里写图片描述

这里写图片描述

这里写图片描述

                    Block与全局变量:

这里写图片描述

pragma mark ——– Block与数组排序

 block的好处:
 1.当把Block当作参数 传入方法中
 2.非常灵活 可以灵活掌控Block的实现
 3.也就是 你传入的Block实现的是声明功能,你这个方法 就实现什么功能
 Block;用处之一就是排序.

 实例:
   NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2",@"7",@"4",@"6", nil];
   // 系统方法实现:
   [array sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
 // 交换位置
 // 实现部分,填写obj1 和 obj2 的关系
 // 实现原理: 数组中两个元素进行比较
 // 比较后 返回值 如果前面比后面大 则交换
 // 经此比较到最后一个元素 完成排序
// compare:可以比较的类型:1.字符串类型(NSString *) 2.NSNmuber *类型
  NSString *str1 = (NSString *)obj1; // 类型转换,看数组中存放的是什么类型,就把obj转换对应的对象类型
  NSString *str2 = (NSString *)obj2; 
          {
              return NSOrderedDescending;
          }else if([str1 compare:str2] < 0)
          {
              return NSOrderedAscending;
          }else
              return NSOrderedSame;
     }];
     NSLog(@"%@",array);


// 自定义Block方法的实现:
NSComparisonResult (^MyCompare)(id obj1,id obj2) = ^NSComparisonResult(id obj,id obj2){
   // 先确定类型
   NSNumber *num1 = (NSNumber *)obj1;
   NSNumber *num2 = (NSNumber *)obj2;
   if([num1 compare:num2] > 0){
       return NSOrderedDescending;  
   }else if([num1 compare:num2] < 0){
       return NSOrderedAscending;
   }else
       return NSOrderedSame;
};
  // 需要什么类型 咱就给什么类型 就行
  [array sortUsingComparator:MyCompare];
  NSLog(@"%@",array); 

pragma mark ——– 字面量

// 切记:字面量使用的初始化方法 是类方法初始化
NSArray *array = [NSArray arrayWithObiects:@“1”,@“2”,nil];
相当于:
NSArray *arrayNew = @[@“1”,@“2”];
//取出一个元素
[arrayNew objectAtIndex:0]; 相当于: arrayNew[0];

总结:
block是苹果最推崇的语法,iOS4.0之后的类都添加了block⽀
持。block通常当参数来使⽤。
字⾯量是⼀种新型的写法,能在⼀定程度上简化代码。
字⾯量创建的对象是便利构造的,且是不可变的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值