欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

iOS中block的定義和使用

本篇內(nèi)容介紹了“iOS中block的定義和使用”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

虎林網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站開(kāi)發(fā)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)建站從2013年開(kāi)始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

概念

代碼塊block是蘋(píng)果在iOS4開(kāi)始引入的對(duì)C語(yǔ)言的擴(kuò)展,用來(lái)實(shí)現(xiàn)匿名函數(shù)的特性,block是一種特殊的數(shù)據(jù)類型,其可以正常定義變量、作為參數(shù)、作為返回值,特殊地,block還可以保存一段代碼,在需要的時(shí)候調(diào)用,目前block已經(jīng)廣泛應(yīng)用于iOS開(kāi)發(fā)中,常用于GCD、動(dòng)畫(huà)、排序及各類回調(diào)

block:我們稱代碼塊,他類似一個(gè)方法。而每一個(gè)方法都是在被調(diào)用的時(shí)候從硬盤(pán)到內(nèi)存,然后去執(zhí)行,執(zhí)行完就消失,所以,方法的內(nèi)存不需要我們管理,也就是說(shuō),方法是在內(nèi)存的棧區(qū)。所以,block不像OC中的類對(duì)象(在堆區(qū)),他也是在棧區(qū)的。如果我們使用block作為一個(gè)對(duì)象的屬性,我們會(huì)使用關(guān)鍵字copy修飾他,因?yàn)樗跅^(qū),我們沒(méi)辦法控制他的消亡,當(dāng)我們用copy修飾的時(shí)候,系統(tǒng)會(huì)把該 block的實(shí)現(xiàn)拷貝一份到堆區(qū),這樣我們對(duì)應(yīng)的屬性,就擁有的該block的所有權(quán)。就可以保證block代碼塊不會(huì)提前消亡。

定義與使用

block 變量的聲明

block 變量的聲明格式:返回值類型(^block名字)(參數(shù)列表);

block 變量的聲明格式:返回值類型(^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類型

在實(shí)際使用Block的過(guò)程中,我們可能需要重復(fù)地聲明多個(gè)相同返回值相同參數(shù)列表的Block變量,如果總是重復(fù)地編寫(xiě)一長(zhǎng)串代碼來(lái)聲明變量會(huì)非常繁瑣,所以我們可以使用typedef來(lái)定義Block類型

#pragma mark 使用 typedef 定義 block 類型 //定義一個(gè)無(wú)返回值類型 無(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)訪問(wèn)局部變量

在Block中可以訪問(wèn)局部變量在聲明Block之后、調(diào)用Block之前對(duì)局部變量進(jìn)行修改,在調(diào)用Block時(shí)局部變量值是修改之前的舊值在Block中不可以直接修改局部變量

#pragma mark block -----------訪問(wèn)局部變量 //block 中不可以直接修改局部變量 int value1 = 100; void (^block7)(void) = ^(){   NSLog(@"value1:%d",value1); }; value1 = 200; block7();//輸出100

在局部變量前使用下劃線下劃線block修飾,在聲明Block之后、調(diào)用Block之前對(duì)局部變量進(jìn)行修改,在調(diào)用Block時(shí)局部變量值是修改之后的新值在局部變量前使用下劃線下劃線block修飾,在Block中可以直接修改局部變量

#pragma mark block -----------訪問(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)訪問(wèn)全局變量

在聲明Block之后、調(diào)用Block之前對(duì)全局變量進(jìn)行修改,在調(diào)用Block時(shí)全局變量值是修改之后的新值

#pragma mark ------------------block 訪問(wèn)全局變量 //在Block中可以訪問(wèn)全局變量 value2 = 100; void(^block8)(void) = ^(){  //在Block中可以直接修改全局變量  self->value2++;  NSLog(@"value2:%d",self->value2); }; value2 = 200; block8();

block內(nèi)訪問(wèn)靜態(tài)變量

#pragma mark --------block內(nèi)訪問(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)部又訪問(wèn)了該對(duì)象,那么會(huì)造成循環(huán)引用

情況一

@interface Person : NSObject@property (nonatomic, copy) void(^myBlock)();@end@implementation Person- (void)dealloc{ NSLog(@"Person dealloc");}@endPerson *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");}@endPerson *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");}@endPerson *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");}@endPerson *p = [[Person alloc] init];[p resetBlock];// Person對(duì)象在這里可以正常被釋放

“iOS中block的定義和使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

分享名稱:iOS中block的定義和使用
文章位置:http://aaarwkj.com/article34/pcocpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、企業(yè)網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)、建站公司、企業(yè)建站、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
少妇按摩高潮呻吟av| 欧美日韩亚洲人人夜夜澡| 国产欧美精品久久三级| 美日韩黄色大片免费看| 亚洲精品入口一区二区| 五月婷婷少妇中文字幕| 91美女黑丝免费国产视频| 亚洲精品一区二区影院| 免费在线观看欧美色妇| 日本精品视频免费网| av手机天堂网免费观看| 97视频精品全部免费观看| 激情一区二区三区视频| 亚洲精品成人一区二区| 亚洲欧美韩国日本成人综合| 亚洲成人精品免费观看| 国产日产亚洲综合一区| 日韩欧美一区精品在线观看| 亚洲精品隔壁傲慢人妻| 久久九特黄的免费大片| 禁止18黄色免费网站| 亚洲精品欧美无人区乱码| 成人爱爱视频在线免费观看| 好看的中文字幕人妻少妇| 亚洲欧美成人高清在线观看| 成人精品午夜福利视频| 亚洲精品国产亚洲精品| 欧美午夜激情片在线观看| 一区二区三区三级视频| 亚洲综合日韩精品在线| 欧美另类不卡在线观看| 亚洲精品成人在线国产| 日韩欧美二区三区在线| 国产精品高清呻吟久久久| 日韩av天堂免费网站| 欧美一区二区精品网站| 成年人免费国产视频网站| av黄色资源在线观看| 人妻av在线中文字幕| 日韩精品色av一区二区| 国产精品岛国片在线观看|