block三种使用场景

2016-08-05  本文已影响38人  墨狂之逸才

使用场景

定义一个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();
}
上一篇 下一篇

猜你喜欢

热点阅读