美文网首页我的iOS开发小屋iOS_小蟹专题Objective-C
iOS开发基础:开发两年的你也不会写的Block

iOS开发基础:开发两年的你也不会写的Block

作者: 溪石iOS | 来源:发表于2016-06-18 11:39 被阅读3398次

阅读本文之前,请尝试写出以下问题:

  1. 声明一个Block,并调用它。
  2. 声明一个Block型的属性。
  3. 声明一个方法,接受一个Block型的参数,并写出调用时传入的Block实参。
  4. 实现一个Block的递归调用(Block调用自己)。
  5. 实现一个方法,将Block作为返回值。

现在拿出笔纸,关上屏幕,20分钟后见...


欢迎回来!如果你未能写出以上问题的答案,本文将给你答案。

本文使用以下符号,含义列举如下:

  • return_type 表示返回的对象/关键字等(通常是void)
  • blockName 表示block的名称
  • var_type 表示参数的类型
  • varName 表示参数名称

声明一个Block,作为局部变量:

return_type (^blockName)(var_type) = ^return_type (var_type varName) {
    // ...
};
blockName(var);

声明一个Block型的属性

注意与局部变量的声明比较,有细微差别,你能指出吗?

@property (copy) return_type (^blockName) (var_type);

在定义方法时,声明Block型的形参

这里提供的是Block的定义

- (void)yourMethod:(return_type (^)(var_type))blockName;

Block作为实参

调用方法时,传入Block,这里需要的是Block的具体实现

[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
    //...
}];

如果已经定义了局部变量的Block,也可以直接传入名称。

匿名Block

Block实现时,如上文的局部变量和实参,等号右边就是一个匿名Block,它没有blockName

^return_type (var_type varName)
{
    //...
};

typedef Block

利用typedef简化Block的声明:

typedef return_type (^BlockTypeName)(var_type);

然后可用BlockTypeName定义Block,类似类名的使用方法:

BlockTypeName aBlock = ^return_type (var_type) {
    //...
}

内联 Block

这种形式并不常用,匿名Block声明后立即被调用:

^return_type (var_type varName)
{
    //...
}(var);

内联 Block可用于代码分块,提高代码可读性,功能类似大括号的代码块,其它功能非常有限:

{
   //...
}

递归调用Block

Block内部调用自身,递归调用是很多算法基础,特别是在无法提前预知循环终止条件的情况下。注意 由于Block内部引用了自身,这里必须使用__block避免保留环问题。

__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
    if (returnCondition)
    {
        blockName = nil;
        return;
    }
    // ...
    blockName(varName);
} copy];
blockName(varValue);

Block作为返回值

方法的返回值是一个Block,可用于一些“工厂模式”的方法中:

- (return_type(^)(var_type))methodName
{
    // ...
}

如果你发现本文没有列举的Block写法,欢迎指出。

相关文章

网友评论

  • c7325f5ee60e:自从用了RAC以后,block就不怎么用了!
    溪石iOS:@Kernel_lj 要得:+1:
    c7325f5ee60e:@溪石 我的意思是不怎么自定义block了,基本上都用RACSubject代替了,别误会!
    溪石iOS:@Kernel_lj
    @weakify(self);
    RACSignal *requestSignal = [RACSignal createSignal:^(id<RACSubscriber> subscriber) {
    @strongify(self);
    return [RACDisposable disposableWithBlock:^{
    }];
    }];
    RAC全是赤裸裸的Block调用啊 :sweat_smile:
  • William_:var是什么鬼?搞笑了吧!:-1:
    溪石iOS:@William_ 英文variable,变量的意思,难不成现在都是只学脚本的吗?:sweat:
  • 952625a28d0d:我觉得block最多的使用应该就是网络请求了吧,现在的项目一般都有网络请求
  • c7afbc95074c:666我基本没用过
  • 背着吉他去流浪:几分钟就能搞定的问题,却说的那么高深,不过也的确有人不会写block
  • 7emini:辣鸡,真的好辣眼睛:joy:
  • 吖吖吖吖吖:block高阶函数
  • Mg明明就是你:。。。。。。
  • 二营长意大利炮呢:标题吓到我了,感觉不看白做ios开发这么久了
  • 栋柠柒:楼上说的不错,半年这些就能学会了,另外,这 var 也是看得我一脸懵逼啊,哈哈
    溪石iOS:@庸者的救赎 var 就是变量的意思呀,js和swift当做关键字,OC没关系
    庸者的救赎:@栋柠柒 因为这是楼主从国外那个block网站借鉴来的,so……
  • code_间特门:一语戳中泪点,受伤了🤕️
    溪石iOS:@code_间特门 :scream:sorry,sorry
  • Cocody:我以为不会写的只有我,原来大家都这样。Xcode 可以帮着做,被惯坏了。
  • 依然范特昔:var也是醉
    溪石iOS:@依然范特昔 一恍惚觉得是 swift吧:stuck_out_tongue_winking_eye:
  • Tracy_ljs:这些东西半年开发就应该会了
  • 天口三水羊:题目很霸气 内容不审核了 直接给过
    溪石iOS:@天口三水羊 三( :v:'ω'):v:

本文标题:iOS开发基础:开发两年的你也不会写的Block

本文链接:https://www.haomeiwen.com/subject/wotudttx.html