真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

block應(yīng)該注意的三個(gè)問(wèn)題!

問(wèn)題一: block對(duì)象的生命周期?

創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供開(kāi)江網(wǎng)站建設(shè)、開(kāi)江做網(wǎng)站、開(kāi)江網(wǎng)站設(shè)計(jì)、開(kāi)江網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、開(kāi)江企業(yè)網(wǎng)站模板建站服務(wù),十多年開(kāi)江做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

直接看代碼,打印結(jié)果是什么?

#import 

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

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

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

#import 
void function(int number, void (^blockParam)(void)) {
    //打印傳入的number值
    printf("傳入的number是: %d\n", number);
    //調(diào)用傳入的block對(duì)象
    blockParam();
}

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

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

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

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

        //第三部分:重新再寫(xiě)一次block的定義部分,再調(diào)用function函數(shù)
        internalBlock = ^(void) { printf("全局變量globalNumber:%d; 局部靜態(tài)變量localStaticInt:%d; 局部變量localInt:%d\n", globalNumber, localStaticInt, localInt); };
        function(3, internalBlock);
        
        //第四部分:考察__block類(lèi)型修飾問(wèn)題
        __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);
        };
        //調(diào)用/執(zhí)行firstBlock
        firstBlock();
    }
    return 0;
}

分析:

    初始化:全局:1000;局部靜態(tài):20;局部變量:20

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

     b.globalNumber   =3000;

     localStaticInt =0;

     localInt       =0;

    function(2, internalBlock);

    包除了包含可執(zhí)行的代碼,還包含可訪問(wèn)的變量的值(全局:3000;局部靜態(tài):0;局部變量:20);原因是block體內(nèi)對(duì)局部變量沒(méi)有修改的權(quán)限,還是原來(lái)第一次執(zhí)行的包的數(shù)據(jù)

     c.重新再定義internalBlock塊對(duì)象,此時(shí)包內(nèi)就重新包含了新的值(全局:1000;局部靜態(tài):0;局部變量:0)

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

   function(3, internalBlock);

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

問(wèn)題三:Block體循環(huán)應(yīng)用的問(wèn)題,如何解決(考察__weak類(lèi)型)

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

例子中,block屬性是blockObj對(duì)象的;而在block體中,block又引用了blockObj對(duì)象,造成了循環(huán)引用。

解決的辦法是:

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

__weak是弱引用,blockObj被釋放的時(shí)候,weakBlockObj已經(jīng)是nil了。


網(wǎng)頁(yè)名稱(chēng):block應(yīng)該注意的三個(gè)問(wèn)題!
標(biāo)題URL:http://weahome.cn/article/jcedjh.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部