block总结(温故而知新)

Block

block实际上是Objective-C语言对闭包的实现。

闭包(Closure)

闭包就是一个函数,或者一个指向函数的指针,加上这个函数执行的非局部变量。
闭包允许一个函数访问声明该函数运行上下文中的变量,以及不同运行上下文中的变了。

function funA(callback){
    alert(callback());
}
function funB(){
    var str = "Hello World"; // 函数funB的局部变量,函数funA的非局部变量
    funA(
        function(){
            return str;
        }
    );
}

因为闭包性,上面函数funA中的callback可以访问到funB中的变量str

Block
block的结构.png
//
//  ViewController.h
//  blockLearn
//
//  Created by xiaodoubaba on 16/2/10.
//  Copyright © 2016年 xiaodoubaba. All rights reserved.
//

#import <UIKit/UIKit.h>

//定义block类型
typedef int(^typedefBlock)(int);


@interface ViewController : UIViewController
//自定义类型的block
@property (copy, nonatomic) typedefBlock myBlock;

//block作为property 直接定义
@property (copy, nonatomic) NSString * (^propertyBlock)(int);

//当做函数参数作为callback 匿名block
+ (NSString *)callBackFunc:(int)age success:(void(^)(NSString *tip))success failure:(void(^)(NSError *error))failure;
@end

//
//  ViewController.m
//  blockLearn
//
//  Created by xiaodoubaba on 16/2/10.
//  Copyright © 2016年 xiaodoubaba. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self insideBlock];
    
    //property block的定义
    self.propertyBlock = ^(int num) {
        NSString *returnStr = [NSString stringWithFormat:@"passed num: %d",num];
        return returnStr;
    };
    self.propertyBlock(2);
    
    //可以用于不同页面间传值 将3传给其他页面
    self.myBlock(3);
    
    //调用外部block
    int outSideResult = outSideBlock(5);
    NSLog(@"outSideResult is %d", outSideResult);
    
    //调用外部返回对象
    NSString *strResult = returnString(@"World");
    NSLog(@"%@",strResult);
}

#pragma mark - 定义在方法内的Block
- (void)insideBlock{
    //无返回值无参数
    void (^noArgsNoReturn)() = ^(){
        NSLog(@"No Args And No Return");
    };
    //调用noArgsNoReturn
    noArgsNoReturn();
    
    //无返回值有参数
    void (^argsNoReturn)(int) = ^(int num){
        NSLog(@"%d",num);
    };
    //调用argsNoReturn
    argsNoReturn(9);
    
    //有返回值有参数
    int (^argsReturn)(int) = ^(int num){
        return num * 5;
    };
    //调用argsReturn
    int result = argsReturn(10);
    NSLog(@"result is %d",result);
}

#pragma mark - 定义在方法外的Block
//定义在方法外的
int (^outSideBlock)(int) = ^(int num) {
    return num * 5;
};

//返回对象
NSString* (^returnString)(NSString *) = ^(NSString *str) {
    NSString *joinStr = [NSString stringWithFormat:@"Hello %@",str];
    return joinStr;
};

#pragma mark - block做为函数参数
//当做函数参数作为callback 匿名block
+ (NSString *)callBackFunc:(int)age success:(void(^)(NSString *tip))success failure:(void(^)(NSError *error))failure
{
    NSString *str = [NSString stringWithFormat:@"%d",age];
    if (age >= 18) {
        NSString *string = [NSString stringWithFormat:@"年龄%d,已经成年了!",age];
        //成功回调
        success(string);
    }else{
        NSError *error = [NSError errorWithDomain:@"还未成年" code:0000 userInfo:nil];
        //失败回调
        failure(error);
    }
    return str;
}

#pragma mark - 作为参数bloc的使用
- (void)argsBlockExecute
{
    [ViewController callBackFunc:26 success:^(NSString *tip) {
        NSLog(@"我成年了!");
    } failure:^(NSError *error) {
        NSLog(@"我还年轻!");
    }];
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • .相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解。 1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数...
    狼凤皇阅读 491评论 0 0
  • 原文地址:Objective-C中的Block 1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解。 1...
    默默_David阅读 422评论 0 1
  • 以下翻译自Apple官方文档,结合自己的理解记录下来。翻译基于 swift 3.0.1 原文地址 Closure...
    艺术农阅读 1,617评论 0 3
  • #闭包(Closures) 本页包含内容: - 闭包表达式(Closure Expressions) - 尾随闭包...
    刺骨寒阅读 1,280评论 0 0
  • 母亲节到了,学校老师要求孩子们每人给母亲说说心里话,那怕是一句问候。并且还把孩子们说的话发布到老师家长微信群里了。...
    快乐中坚持阅读 970评论 1 3