代碼塊本質(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
[cpp]view plaincopy
void(^printBlock)(NSString?*x);
printBlock?=?^(NSString*?str)
{
NSLog(@"print:%@",?str);
};
printBlock(@"hello?world!");
運(yùn)行結(jié)果是:print:hello world!
[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"
)
代碼塊想要遞歸調(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
在代碼塊中可以使用和改變?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í)保留該聲明和作者博客鏈接,謝謝!