OC10 -- block / 多态

block 的四种形式


    //1. 无参数无返回值
    void (^block1)() = ^(){
        NSLog(@"好烦哦");
    };

    //block 的使用:
    block1();
    //block自己不会执行,必须调用才会执行block大括号中的代码段.



    // 2. 有参数无返回值.
   // void (*p)(int , int) = NULL; (函数指针写法)
    void (^block2)(int, int) = ^(int a , int b){
        int max = a > b ? a : b;
        NSLog(@"%d",max);
    };
    // 使用
    block2(20,10);
    // void (^)(int, int)是block的类型,它的名字是block,我们也通过名进行调用.

    // 参数是字符串:
    void (^block2)(NSString *) = ^(NSString *str){ 
        NSLog(@"%@",str);
    };
    block2(@"哈哈");

   // 参数是一个数组,对数组进行遍历
    void (^block2)(NSArray *) = ^(NSArray *arr){
        for (NSArray *a in arr) {
            NSLog(@"%@",a);
        }
    };
    NSArray *arr = @[@"1",@"2"];
    block2(arr);
    block2(@[@"3",@"6"]);


    // 3. 有返回值,无参数
    int (^block3)() = ^(){
        return 100;
    };
    // block调用时没有参数也要加上括号.
   NSLog(@"%d",block3());



    //4. 有参数,有返回值
    NSString * (^block4)(NSArray *, NSInteger) = ^(NSArray *arr , NSInteger index){
        return  [arr objectAtIndex:index];
    };


    // 给入字符串,返回整型:
    NSInteger (^block4)(NSString *) = ^(NSString *str){
        return str.integerValue;
    };
    NSLog(@"%ld",block4(@"222"));

    // 参数日期字符串,返回NSdate:
    NSDate *(^block4)(NSString *) = ^(NSString *str){
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];
        return [formatter dateFromString:str];
    };
    NSLog(@"%@",block4(@"2015-08-12 19:00:00"));

    //block的函数段中更多使用参数,而返回值是谁调用谁使用.

typedef

#import <Foundation/Foundation.h>
//函数指针的typedef:
//新的类型名写在*之后
typedef int(*PFUN)(int, int);

// block的typedef:
typedef NSString *(^Block)(NSArray *) ;

//练习.有返回值,无参数
typedef NSInteger(^BB)() ;

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

   //通过新的block写一个block
    Block block = ^(NSArray *arr){
        return arr[0];
    };

  return 0;
}

block和局部变量

    // __block相当于a一个在block中修改的权限,否则他只能取值,不能赋值.
   __block int a = 10;
    void (^block)() = ^{
        a = 10 * a;    // 若不写__block就不能用a承接结果.
        NSLog(@"%d",a);
    };
    block();

系统的block

 //通过block对数组进行遍历
  NSArray *arr= [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
    // 系统block,用法就是回车.
    [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%@",obj);
    }];

数组排序

数组对字符串的排序

 //不可变数组
    NSArray *arr = @[@"zhangjian",@"yanglin",@"liujian"];
    //SEL -- 方法选择器,他是方法选择器的类型.
   NSArray *arrnew =  [arr sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"%@",arrnew);
    NSLog(@"%@",arr);

   //可变数组
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"zhangjian",@"yanglin",@"liujian", nil];
    [arr sortUsingSelector:@selector(compare:)];
    NSLog(@"%@",arr);

数组对对象进行排序

    // 新建四个人的对象
    Person *per1 = [Person baseWithName:@"liujia" sex:@"nan"];
    Person *per2 = [Person baseWithName:@"wangjian" sex:@"nan"];
    Person *per3 = [Person baseWithName:@"heshuang" sex:@"nv"];

    //不可变数组
    // 用字面量创建对象和便利构造器创建是一样的
    NSArray *arr = @[per1,per2,per3,per4];
    //以学生姓名作为排序依据
    NSArray *newArr = [arr sortedArrayUsingComparator:^NSComparisonResult(Person * obj1, Person * obj2) {

    return -[obj1.name compare:obj2.name]; // 若想降序排列就在前面添加-号.
    }];
    // 打印姓名.   
    for (Person *per in newArr) {
        NSLog(@"%@",per.name);
    }

    //可变数组
    NSMutableArray *marr = [NSMutableArray arrayWithObjects:per1,per2,per3,per4, nil];
    [marr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        Person *per11 = (Person *)obj1;
               Person *per22 = (Person *)obj2;
       return [per11.name compare:per22.name];
    }];
    for (Person *per in marr) {
        NSLog(@"%@",per.name);
    };

多态

创建一个BaseModel的类.
BaseModel.h 文件

#import <Foundation/Foundation.h>

@interface BaseModel : NSObject

@property(nonatomic, copy)NSString*name;
@property(nonatomic, copy)NSString *sex;

- (id)initWithName:(NSString *)name sex:(NSString *)sex;

+ (id)baseWithName:(NSString *)name sex:(NSString *)sex;

@end

BaseModel.m 文件

#import "BaseModel.h"
@implementation BaseModel

- (id)initWithName:(NSString *)name sex:(NSString *)sex{
    self = [super init];
    if (self) {
        self.name = name;
        self.sex = sex;
    }
    return self;
}

+ (id)baseWithName:(NSString *)name sex:(NSString *)sex{
    //用多态的方式完成对这个对象的创建.

    id obj = [[[self class] alloc] initWithName:name sex:sex];
    return obj;
}
@end

在创建一个Student 类, 继承于BaseModel
main.m 文件

    Person *per = [Person baseWithName:@"张贱" sex:@"男"];
    NSLog(@"%@",per.name);

直接可以调用baseWithName方法创建对象.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值