重要经验五:block作为属性的注意事项

  现代ios应用的开发,不使用GCD和block,效率会降低很多,在今年3月份之前,我在block的学习和使用方面,精力和经验都明显不足,在SF有个牛逼同事,不仅自己积累了一套库,而且对这个库持续进行更新和维护,其架构能力和代码水平都不错,他的代码中使用了大量的GCD,为了适应这些技术,我在coding的过程中,开始有意识的多写GCD的代码,刚开始一切顺利,直到我使用block来作为一个对象的属性,这让我纠结了很久。

  我遇到的问题是:1,这种属性block,其他类在使用的时候,应该怎么写? 2,block的类型不为void、int,而是对象时,比如NSString*时,又应该怎么办?

  这两个很简单的问题,让我前后一起纠结了2个多小时。下面,我把我的测试代码上上来,希望对遇到同样问题的人,有所帮助。下面直接上代码了。

头文件如下,实现文件中不需要实现任何代码。

#import <Foundation/Foundation.h>

typedef int(^compareBlock)(int a, int b);

@interface HBTestBlock : NSObject

@property(nonatomic, copy) compareBlock compare;

@property(nonatomic, copy) UIView *(^viewGetter)(NSString *imageName); //注意其返回类型为UIView *

@end

下面这两个函数,展示的是如何在其他的类中,使用这两个属性。

#pragma mark 测试对象的属性为block

- (void)testObjPropertyBlock

{

    HBTestBlock *objPropertyBlockObj = [[HBTestBlock alloc] init];

    objPropertyBlockObj.viewGetter = ^(NSString *imageName){

//        return [[UIView alloc] init]; //特别注意此处,若对象不匹配,则会报错,设置为nil也会报错。

        return [self currentView];

    };

    objPropertyBlockObj.viewGetter(@"hello"); //实际执行block

}


- (UIView *)currentView

{

    NSLog(@"now I am in currentView");

    return nil;

}


- (void)testPropertyBlock

{

    HBTestBlock *properBlockObj = [[HBTestBlock alloc] init];

    properBlockObj.compare = ^(int a,int b)

    {

        int result = [self maxer:a another:b];

        NSLog(@"the result is %d",result);

        return result;

    };

    NSLog(@"the properBlockObj.compare is %d",properBlockObj.compare(100,200));

}


- (int)maxer:(int)a another:(int)b

{

    if (a > b) {

        return a;

    }

    return  b;

}





  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值