筆記:iOS block

代碼塊本質(zhì)上是和其他變量類似。不同的是,代碼塊存儲(chǔ)的數(shù)據(jù)是一個(gè)函數(shù)體。使用代碼塊是,你可以像調(diào)用其他標(biāo)準(zhǔn)函數(shù)一樣,傳入?yún)?shù)數(shù),并得到返回值。

脫字符(^)是塊的語(yǔ)法標(biāo)記。按照我們熟悉的參數(shù)語(yǔ)法規(guī)約所定義的返回值以及塊的主體(也就是可以執(zhí)行的代碼)。下圖是如何把塊變量賦值給一個(gè)變量的語(yǔ)法講解:

按照調(diào)用函數(shù)的方式調(diào)用塊對(duì)象變量就可以了:

int result = myBlock(4); // result是 28

1、參數(shù)是NSString*的代碼塊

[cpp]view plaincopy

void(^printBlock)(NSString?*x);

printBlock?=?^(NSString*?str)

{

NSLog(@"print:%@",?str);

};

printBlock(@"hello?world!");

運(yùn)行結(jié)果是:print:hello world!

2、代碼用在字符串?dāng)?shù)組排序

[cpp]view plaincopy

NSArray?*stringArray?=?[NSArray?arrayWithObjects:@"abc?1",?@"abc?21",?@"abc?12",@"abc?13",@"abc?05",nil];

NSComparator?sortBlock?=?^(id?string1,?id?string2)

{

return[string1?compare:string2];

};

NSArray?*sortArray?=?[stringArray?sortedArrayUsingComparator:sortBlock];

NSLog(@"sortArray:%@",?sortArray);

運(yùn)行結(jié)果:sortArray:(

"abc 05",

"abc 1",

"abc 12",

"abc 13",

"abc 21"

)

3、代碼塊的遞歸調(diào)用

代碼塊想要遞歸調(diào)用,代碼塊變量必須是全局變量或者是靜態(tài)變量,這樣在程序啟動(dòng)的時(shí)候代碼塊變量就初始化了,可以遞歸調(diào)用

[cpp]view plaincopy

staticvoid(^constblocks)(int)?=?^(inti)

{

if(i?>?0)?{

NSLog(@"num:%d",?i);

blocks(i?-?1);

}

};

blocks(3);

運(yùn)行打印結(jié)果:

num:3

num:2

num:1

4、在代碼塊中使用局部變量和全局變量

在代碼塊中可以使用和改變?nèi)肿兞?/p>

[cpp]view plaincopy

intglobal?=?1000;

intmain(intargc,constchar*?argv[])

{

@autoreleasepool?{

void(^block)(void)?=?^(void)

{

global++;

NSLog(@"global:%d",?global);

};

block();

NSLog(@"global:%d",?global);

}

return0;

}

運(yùn)行打印結(jié)果:

global:1001

global:1001

而局部變量可以使用,但是不能改變。

[cpp]view plaincopy

intlocal?=?500;

void(^block)(void)?=?^(void)

{

local++;

NSLog(@"local:%d",?local);

};

block();

NSLog(@"local:%d",?local);

在代碼塊中改變局部變量編譯不通過(guò)。怎么在代碼塊中改變局部變量呢?在局部變量前面加上關(guān)鍵字:__block

[cpp]view plaincopy

__blockintlocal?=?500;

void(^block)(void)?=?^(void)

{

local++;

NSLog(@"local:%d",?local);

};

block();

NSLog(@"local:%d",?local);

運(yùn)行結(jié)果:local:501

local:501

著作權(quán)聲明:本文由http://blog.csdn.net/totogo2010/原創(chuàng),歡迎轉(zhuǎn)載分享。請(qǐng)尊重作者勞動(dòng),轉(zhuǎn)載時(shí)保留該聲明和作者博客鏈接,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄 Block概述 Block定義方式 Block保存代碼 Block傳值 Block對(duì)外部變量的傳遞 Bloc...
    子斌閱讀 1,493評(píng)論 2 7
  • iOS代碼塊Block 概述 代碼塊Block是蘋果在iOS4開始引入的對(duì)C語(yǔ)言的擴(kuò)展,用來(lái)實(shí)現(xiàn)匿名函數(shù)的特性,B...
    smile刺客閱讀 2,466評(píng)論 2 26
  • 前言 Blocks是C語(yǔ)言的擴(kuò)充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,852評(píng)論 0 23
  • Block使用場(chǎng)景,可以在兩個(gè)界面的傳值,也可以對(duì)代碼封裝作為參數(shù)的傳遞等。用過(guò)GCD就知道Block的精妙之處。...
    Coder_JMicheal閱讀 814評(píng)論 2 1
  • 《Objective-C高級(jí)編程》這本書就講了三個(gè)東西:自動(dòng)引用計(jì)數(shù)、block、GCD,偏向于從原理上對(duì)這些內(nèi)容...
    WeiHing閱讀 10,087評(píng)論 10 69

友情鏈接更多精彩內(nèi)容