問(wèn)題一: block對(duì)象的生命周期?
成都創(chuàng)新互聯(lián)公司專(zhuān)注于鄂爾多斯網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供鄂爾多斯?fàn)I銷(xiāo)型網(wǎng)站建設(shè),鄂爾多斯網(wǎng)站制作、鄂爾多斯網(wǎng)頁(yè)設(shè)計(jì)、鄂爾多斯網(wǎng)站官網(wǎng)定制、微信小程序定制開(kāi)發(fā)服務(wù),打造鄂爾多斯網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鄂爾多斯網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。直接看代碼,打印結(jié)果是什么?
#import <Foundation/Foundation.h> //定義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體中訪(fǎng)問(wèn)全局變量/局部靜態(tài)變量/局部變量的問(wèn)題,如何解決(考察__block類(lèi)型)
#import <Foundation/Foundation.h> 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í)行的代碼,還包含可訪(fǎng)問(wèn)的變量的值(全局:1000; 局部靜態(tài):20; 局部變量:20)
b. globalNumber = 3000;
localStaticInt = 0;
localInt = 0;
function(2, internalBlock);
包除了包含可執(zhí)行的代碼,還包含可訪(fǎng)問(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ù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
新聞標(biāo)題:block應(yīng)該注意的三個(gè)問(wèn)題!-創(chuàng)新互聯(lián)
文章源于:http://www.rwnh.cn/article18/dscsgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、建站公司、面包屑導(dǎo)航、ChatGPT、定制開(kāi)發(fā)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)