Objective-C基礎之閉包

前言

Objective-C中的塊(block),類似於JavaScript中閉包,可以作爲回調函數使用。這篇文章簡單的記錄了我在學習塊的時候的一些自身的理解

正文

什麼是閉包(Closure)

閉包就是一個函數,或者一個指向函數的指針,加上這個函數執行的非局部變量。
說的通俗一點,就是閉包允許一個函數訪問聲明該函數運行上下文中的變量,甚至可以訪問不同運行上文中的變量。

我們用腳本語言來看一下:

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

通過上面的代碼我們可以看出,按常規思維來說,變量str是函數funB的局部變量,作用域只在函數funB中,函數funA是無法訪問到str的。但是上述代碼示例中函數funA中的callback可以訪問到str,這是爲什麼呢,因爲閉包性。

ignore : javaScript的存在閉包是因爲,function裏面可以再次定義function,在第二個function裏面訪問第一個function的變量。而第二個function是可以在其他地方被調用的(可以返回這個function,也可以把它放到其它函數的參數列表裏面當參數傳遞)

Objective-C中的閉包

Objective-C 裏面也有閉包,它是Block。 Block類似於function方法(有自己的方法體,參數),block可以在 selector 如: -(returnType) methodName:(variableType) variableName 的方法體裏面定義。Block裏面可以使用Objective-C方法的局部變量。Block方法可以在其他地方使用(放到其它selector的參數列表裏面,用到是回調這個塊);

閉包例子

//.h
typedef BOOL (^blockType) (int);
-(blockType) blockUser;
//.m
/** 調用Block(閉包)*/
-(void)callBlockCode:(BOOL (^)(int)) bVariable {
    BOOL result = bVariable(1);
    if(!result) {
        NSLog(@"Hello Block");
    }

}
/** 將Block類型在.h文件定義*/
-(blockType) blockUser {
    blockType blockVariable; //block原型聲明,blockType在頭文件typedel定義
    int flag = 0;
    blockVariable = ^ (int param) {//block定義
        if(flag * param) {
            return YES;
        }
        return NO;
    };
    [self callBlockCode:blockVariable];
    return blockVariable;
}

//main
blockType bVariable = [test blockUser];
BOOL bv = bVariable(3);
NSLog(@"Block返回結果:%i",bv);

在main中特意返回一個Block並調用,沒有任何問題,也說明了在main中也是可以訪問閉包定義所在的上下文的變量,如這裏的flag(在@Implementation裏面)

塊的語法

這裏用先暫用一副圖來描述它使用的語法
這裏寫圖片描述

這裏int (^myBlock) (int) 是一個塊變量,在塊變量中的參數列表可以只是一個類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章