91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

block應該注意的三個問題!

發布時間:2020-07-09 15:06:45 來源:網絡 閱讀:436 作者:禪信23 欄目:移動開發

問題一: block對象的生命周期?

直接看代碼,打印結果是什么?

#import <Foundation/Foundation.h>

//定義block對象(全局block)
int (^externBlock)(void) = ^(void){return 100;};
//定義函數(block做為參數)
void function(int (^block)(void)) {
    printf("執行block的結果是:%d\n\n", block());
}
//定義的兩個函數
void firstFunc(int number) {
    //定義塊對象(局部)
    int (^blockWithinFirst)(void) = ^(void) { return number; };
    //調用外部的function函數
    function(blockWithinFirst);
    //賦值
    externBlock = blockWithinFirst;
}
void secondFunc(int number) {
    //int局部變量
    int index = 10;
    //block局部對象
    int (^blockWithinSecond)(void) = ^(void) {return number * index;};
    //調用外部function函數
    function(blockWithinSecond);
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //1.調用function函數
        function(externBlock);
        //2.調用firstFunc
        firstFunc(5);
        //3.調用secondFunc
        secondFunc(10);
        //4.和步驟1一樣
        function(externBlock);
    }
    return 0;
}


問題二:Block體中訪問全局變量/局部靜態變量/局部變量的問題,如何解決(考察__block類型)

#import <Foundation/Foundation.h>
void function(int number, void (^blockParam)(void)) {
    //打印傳入的number值
    printf("傳入的number是: %d\n", number);
    //調用傳入的block對象
    blockParam();
}

int globalNumber = 1000;//全局變量(外部變量)

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //塊聲明(沒有傳參,沒有返回值)
        void (^internalBlock)(void);
        //局部靜態變量
        static int localStaticInt = 20;
        //局部變量:local variable(自由變量:free variable)
        int localInt = 20;
        
        //第一部分:將block對象最為函數的參數,在函數內部調用block
        //塊定義(打印上面三個變量的值);
        internalBlock = ^(void) { printf("全局變量globalNumber:%d; 局部靜態變量localStaticInt:%d; 局部變量localInt:%d\n", globalNumber, localStaticInt, localInt); };
        //將internalBlock塊對象作為function的參數,調用function函數
        function(1, internalBlock);

        //第二部分:修改上述三個變量的值,重新調用function函數
        globalNumber   = 3000;
        localStaticInt = 0;
        localInt       = 0;
        function(2, internalBlock);

        //第三部分:重新再寫一次block的定義部分,再調用function函數
        internalBlock = ^(void) { printf("全局變量globalNumber:%d; 局部靜態變量localStaticInt:%d; 局部變量localInt:%d\n", globalNumber, localStaticInt, localInt); };
        function(3, internalBlock);
        
        //第四部分:考察__block類型修飾問題
        __block int localAnotherInt = 20;
        void (^firstBlock)(void) = ^(void) {
            globalNumber += 100;
            localStaticInt += 200;
            localAnotherInt = 10;
            printf("重新賦值后的globalNumber:%d;localStaticInt:%d; localAnotherInt:%d\n\n", globalNumber, localStaticInt,localAnotherInt);
        };
        //調用/執行firstBlock
        firstBlock();
    }
    return 0;
}

分析:

    初始化:全局:1000; 局部靜態:20; 局部變量:20

     a. function(1, internalBlock); 包除了包含可執行的代碼,還包含可訪問的變量的值(全局:1000; 局部靜態:20; 局部變量:20)

     b. globalNumber   = 3000;

     localStaticInt = 0;

     localInt       = 0;

     function(2, internalBlock);

     包除了包含可執行的代碼,還包含可訪問的變量的值(全局:3000; 局部靜態:0; 局部變量:20);原因是block體內對局部變量沒有修改的權限,還是原來第一次執行的包的數據

     c. 重新再定義internalBlock塊對象, 此時包內就重新包含了新的值(全局:1000; 局部靜態:0; 局部變量:0)

        internalBlock = ^(void) { printf("全局變量globalNumber:%d; 局部靜態變量localStaticInt:%d; 局部變量localInt:%d\n", globalNumber, localStaticInt, localInt); };

    function(3, internalBlock);

    d.如果把局部的變量的類型添加__block類型,可以在block體中修改局部變量的值(重新賦值后的globalNumber:3100;localStaticInt:200; localAnotherInt:10


問題三:Block體循環應用的問題,如何解決(考察__weak類型)

    TRBlockObject *blockObj = [TRBlockObject new];
    blockObj.block = ^void(void){
        NSLog(@"blockObj%@“,blockObj);
    };

例子中,block屬性是blockObj對象的;而在block體中,block又引用了blockObj對象,造成了循環引用。

解決的辦法是:

    TRBlockObject *blockObj = [TRBlockObject new]; 
    //解決循環引用的方案使用__weak修飾符。
    __weak TRBlockObject *weakBlockObj = blockObj;
    
    blockObj.block = ^void(void){
        NSLog(@"blockObj%@",weakBlockObj);
    };

__weak是弱引用,blockObj被釋放的時候,weakBlockObj已經是nil了。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

含山县| 花垣县| 和龙市| 辽源市| 辽宁省| 长葛市| 赣榆县| 临沂市| 昂仁县| 高要市| 阜新市| 泽州县| 蒙山县| 甘泉县| 仪征市| 江达县| 太仓市| 屏南县| 越西县| 赤水市| 和田县| 丰原市| 盘锦市| 法库县| 勃利县| 灵璧县| 吉林市| 长宁区| 托克逊县| 武隆县| 信宜市| 于都县| 芜湖市| 杭锦旗| 尚义县| 奉节县| 右玉县| 襄城县| 班戈县| 乌兰察布市| 阳东县|