美文网首页
block三种使用场景

block三种使用场景

作者: 墨狂之逸才 | 来源:发表于2016-08-05 12:04 被阅读38次

使用场景

  • block代码块保存在对象属性之中,等到时机成熟调用(外界界定block内容,block外部调用)
  • 当做方法的参数使用(外界决定block内容,block方法内部调用,刚开始学的时候一直想不通系统的block作为参数的使用)
  • 当做方法的返回值,用于代替方法(block内容由方法内部实现,外部调用block)
定义一个Person类
#import <Foundation/Foundation.h>

@interface Person : NSObject

typedef void(^BlockType)();

//声明了一个block属性
//在ARC使用strong,非ARC使用copy
@property (nonatomic, strong) void(^operation)() ;

//void(^)()表示block类型
- (void)run:(BlockType)block;
- (void)eat:(void(^)())block;

//void(^operation)()作为属性:相当于类型+名字->就是block的声明: returnType(^blockName)(parameterTypes) 
//(void(^)())block作为参数: 类型+名字

//block当做返回值使用,目的就是代替方法,block方法的定义是由这个方法内部决定的,我们不知道,不同于block作为参数使用:block的定义由外部决定。
- (void(^)())work;
@end
#import "Person.h"

@implementation Person

- (void)run:(BlockType)block {
    //block当做参数适用,方法内部调用block
    block();
}

- (void)eat:(void (^)())block {
    
    //block的内部调用实例:就是block当做参数使用,这时候在方法的内部调用block。
    block();
}

- (void (^)())work {
    return ^() {
      
        NSLog(@"work hard,好好学习,天天向上");
    };
}

@end
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /**
     *  block的声明:
     *  returnType:返回值类型
     *  blockName:名字
     *  parameterTypes:参数
     *  block的定义:
     *  parameters:参数
     */
//    <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
//        <#statements#>
//    };
    /*
    void(^)() ——>block类型 等同于  typedef void(^BlockType)();此时参数类型就是:void(^)()或者BlockType
    void(^ blockName)() ——>block的声明
    ^(parameters) {
        //code
    };block的定义
    blockName(); block的调用
    */
    /*
     block的使用场景:
     1.作为对象的属性,等到时机的时候赋值block定义,block方法调用(block外部调用)
     2.作为方法的参数,对象调用方法,传入block进去             (block内部调用)
     3.当做方法的返回值,用于代替方法(block内容由方法内部实现,外部调用block)
     
     */
    //block的声明和定义
    void(^block)() = ^() {
        NSLog(@"block代码块调用了");
    };
    
    //block的调用
    block();
    
    Person *p = [[Person alloc] init];
    
    //block保存在对象属性中,等到时机在调用
    void(^operationBlock)() = ^() {
        NSLog(@"operationBlock调用");
    };
//    p.operation = ^() {
//        NSLog(@"person的operation操作");
//    };
    p.operation = operationBlock;
    //调用block
    p.operation();
    
    //block当做参数使用/block的内部调用
    [p eat:^{
        NSLog(@"eat");
    }];
    
    void (^runBlock)() = ^() {
        NSLog(@"run");
    };
    [p run:runBlock];
    
    //当做方法的返回值,用于代替方法(block内容由方法内部实现,外部调用block)
    //block作为方法的返回值使用,有点像个方法的样子
//    p.work首先返回void(^)()类型的block假设叫(blockName==p.work),然后调用(blockName() == p.work()调用block方法 )
    p.work();
}

相关文章

  • block三种使用场景

    使用场景 block代码块保存在对象属性之中,等到时机成熟调用(外界界定block内容,block外部调用) 当做...

  • block开发中使用场景

    block 开发中使用场景 适合新手理解 熟悉 运用到项目中 block开发中使用场景 1.把block保存到对象...

  • Block的三种使用场景

    iOS block介绍 block因其古怪的语法结构所以看上去比较蛋疼,比较难记,还好工作中忘记怎么写了是有技巧...

  • Block使用场景

    引言 最近在研究RAC的时候,发现绝大部分代码实现如下所示: 可以发现是block嵌套使用,这是使用block实现...

  • iOS block 为什么官方文档建议用 copy 修饰

    一、block 的三种类型block 三种类型:全局 block,堆 block、栈 block。全局 block...

  • @strongify@weakify

    @strongify以及@weakify宏命令的使用场景和原理 主要是在block中使用 (因为block一般都在...

  • block的简单使用

    block的使用场景 1.把block保存到对象中,恰当时机的时候才去调用2.把block当做方法的参数使用,外界...

  • Block的三种应用场景

    block开发中使用场景1.把block保存到对象中,恰当的时候才去调用2.把block当做方法的参数使用,外界不...

  • Block开发中使用场景

    block开发中使用场景 1.把block保存到对象中,恰当时机的时候才去调用 2.把block当做方法的参数使用...

  • __block底层原理详解

    _我们先通过一个小场景,开始今天的主题. 一:__block的本质 我们把使用__block修饰的的block转换...

网友评论

      本文标题:block三种使用场景

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