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 操作系統中的棧和堆 注:這里所說的堆和棧與數...
    狼鳳皇閱讀 490評論 0 0
  • 原文地址:Objective-C中的Block 1.相關概念 在這篇筆記開始之前,我們需要對以下概念有所了解。 1...
    默默_David閱讀 417評論 0 1
  • 以下翻譯自Apple官方文檔,結合自己的理解記錄下來。翻譯基于 swift 3.0.1 原文地址 Closure...
    藝術農閱讀 1,616評論 0 3
  • #閉包(Closures) 本頁包含內容: - 閉包表達式(Closure Expressions) - 尾隨閉包...
    刺骨寒閱讀 1,269評論 0 0
  • 母親節到了,學校老師要求孩子們每人給母親說說心里話,那怕是一句問候。并且還把孩子們說的話發布到老師家長微信群里了。...
    快樂中堅持閱讀 968評論 1 3