這篇文章將為大家詳細(xì)講解有關(guān)如何在iOS中定義和使用block,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、阿魯科爾沁網(wǎng)站維護(hù)、網(wǎng)站推廣。定義與使用
block 變量的聲明
block 變量的聲明格式:返回值類(lèi)型(^block名字)(參數(shù)列表);
block 變量的聲明格式:返回值類(lèi)型(^block名字)(參數(shù)列表); //聲明一個(gè)無(wú)返回值,兩個(gè)參數(shù)的 block void(^block1)(NSString *a,NSString *b); //省略寫(xiě)法 void(^block2)(NSString *,NSString *);
block變量的賦值
//block變量的賦值 //block變量名 = ^(參數(shù)列表){函數(shù)體}; block1 = ^(NSString *x,NSString *y){ NSLog(@"%@--%@",x,y); }; block1(@"123123",@"QWEQWEQWE");
聲明block變量的同時(shí)進(jìn)行賦值
//聲明 block 變量的同時(shí)進(jìn)行賦值 int(^block3)(int) = ^(int a){ return a*3; }; NSLog(@"%d",block3(3));
使用typedef定義block類(lèi)型
在實(shí)際使用Block的過(guò)程中,我們可能需要重復(fù)地聲明多個(gè)相同返回值相同參數(shù)列表的Block變量,如果總是重復(fù)地編寫(xiě)一長(zhǎng)串代碼來(lái)聲明變量會(huì)非常繁瑣,所以我們可以使用typedef來(lái)定義Block類(lèi)型
#pragma mark 使用 typedef 定義 block 類(lèi)型 //定義一個(gè)無(wú)返回值類(lèi)型 無(wú)參數(shù)列表的 block typedef void (^Block4)(); Block4 block4 = ^(){ NSLog(@"i am block4"); }; block4();
block作為函數(shù)參數(shù)
#pragma mark block作為函數(shù)參數(shù) int(^block5)(int,int) = ^(int a,int b){ return a+b; }; [self useBlock5:block5]; //簡(jiǎn)化書(shū)寫(xiě) //typedef int (^Block6)(int,int);(全局聲明) Block6 block6 = ^(int a,int b){ return a+b; }; [self useBlock6:block6]; - (void)useBlock5:(int(^)(int,int))block5 { NSLog(@"block5:%d",block5(3,5)); } - (void)useBlock6:(Block6 )block6{ NSLog(@"block6:%d",block6(4,5)); }
block內(nèi)訪(fǎng)問(wèn)局部變量
在Block中可以訪(fǎng)問(wèn)局部變量
在聲明Block之后、調(diào)用Block之前對(duì)局部變量進(jìn)行修改,在調(diào)用Block時(shí)局部變量值是修改之前的舊值
在Block中不可以直接修改局部變量
#pragma mark block -----------訪(fǎng)問(wèn)局部變量 //block 中不可以直接修改局部變量 int value1 = 100; void (^block7)(void) = ^(){ NSLog(@"value1:%d",value1); }; value1 = 200; block7();//輸出100
在局部變量前使用下劃線(xiàn)下劃線(xiàn)block修飾,在聲明Block之后、調(diào)用Block之前對(duì)局部變量進(jìn)行修改,在調(diào)用Block時(shí)局部變量值是修改之后的新值
在局部變量前使用下劃線(xiàn)下劃線(xiàn)block修飾,在Block中可以直接修改局部變量
#pragma mark block -----------訪(fǎng)問(wèn)局部變量 //block 中不可以直接修改局部變量 //在局部變量前使用__block修飾,在Block中可以直接修改局部變量 __block int value1 = 100; void (^block7)(void) = ^(){ value1++; NSLog(@"value1:%d",value1); }; value1 = 200; block7();//輸出100 __block 修飾之后輸出200
block內(nèi)訪(fǎng)問(wèn)全局變量
在聲明Block之后、調(diào)用Block之前對(duì)全局變量進(jìn)行修改,在調(diào)用Block時(shí)全局變量值是修改之后的新值
#pragma mark ------------------block 訪(fǎng)問(wèn)全局變量 //在Block中可以訪(fǎng)問(wèn)全局變量 value2 = 100; void(^block8)(void) = ^(){ //在Block中可以直接修改全局變量 self->value2++; NSLog(@"value2:%d",self->value2); }; value2 = 200; block8();
block內(nèi)訪(fǎng)問(wèn)靜態(tài)變量
#pragma mark --------block內(nèi)訪(fǎng)問(wèn)靜態(tài)變量 static int value3 = 100; void(^block9)(void) = ^(){ value3++;//在Block中可以直接修改靜態(tài)變量 NSLog(@"value3:%d",value3); }; //在聲明Block之后、調(diào)用Block之前對(duì)靜態(tài)變量進(jìn)行修改,在調(diào)用Block時(shí)靜態(tài)變量值是修改之后的新值 value3 = 200; block9();
block 造成的循環(huán)引用問(wèn)題
如果對(duì)象內(nèi)部有一個(gè)Block屬性,而在Block內(nèi)部又訪(fǎng)問(wèn)了該對(duì)象,那么會(huì)造成循環(huán)引用
情況一
@interface Person : NSObject @property (nonatomic, copy) void(^myBlock)(); @end @implementation Person - (void)dealloc { NSLog(@"Person dealloc"); } @end Person *p = [[Person alloc] init]; p.myBlock = ^{ NSLog(@"------%@", p); }; p.myBlock(); // 因?yàn)閙yBlock作為Person的屬性,采用copy修飾符修飾(這樣才能保證Block在堆里面,以免Block在棧中被系統(tǒng)釋放),所以Block會(huì)對(duì)Person對(duì)象進(jìn)行一次強(qiáng)引用,導(dǎo)致循環(huán)引用無(wú)法釋放
情況二
@interface Person : NSObject @property (nonatomic, copy) void(^myBlock)(); - (void)resetBlock; @end @implementation Person - (void)resetBlock { self.myBlock = ^{ NSLog(@"------%@", self); }; } - (void)dealloc { NSLog(@"Person dealloc"); } @end Person *p = [[Person alloc] init]; [p resetBlock]; // Person對(duì)象在這里無(wú)法正常釋放,在resetBlock方法實(shí)現(xiàn)中,Block內(nèi)部對(duì)self進(jìn)行了一次強(qiáng)引用,導(dǎo)致循環(huán)引用無(wú)法釋放
解決循環(huán)引用的辦法是使用一個(gè)弱引用的指針指向該對(duì)象,然后在Block內(nèi)部使用該弱引用指針來(lái)進(jìn)行操作,這樣避免了Block對(duì)對(duì)象進(jìn)行強(qiáng)引用
情況一
@interface Person : NSObject @property (nonatomic, copy) void(^myBlock)(); @end @implementation Person - (void)dealloc { NSLog(@"Person dealloc"); } @end Person *p = [[Person alloc] init]; __weak typeof(p) weakP = p; p.myBlock = ^{ NSLog(@"------%@", weakP); }; p.myBlock(); // Person對(duì)象在這里可以正常被釋放
情況二
@interface Person : NSObject @property (nonatomic, copy) void(^myBlock)(); - (void)resetBlock; @end @implementation Person - (void)resetBlock { // 這里為了通用一點(diǎn),可以使用__weak typeof(self) weakP = self; __weak Person *weakP = self; self.myBlock = ^{ NSLog(@"------%@", weakP); }; } - (void)dealloc { NSLog(@"Person dealloc"); } @end Person *p = [[Person alloc] init]; [p resetBlock]; // Person對(duì)象在這里可以正常被釋放
關(guān)于如何在iOS中定義和使用block就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(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)景需求。