美文网首页iOS-block
block总结(温故而知新)

block总结(温故而知新)

作者: HWenj | 来源:发表于2016-02-18 10:46 被阅读47次

    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

    相关文章

      网友评论

        本文标题:block总结(温故而知新)

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