Declaring and Using a Block(定义和使用Block)

1— 无参的block

//1无参void(^myblocks)(void)=NULL;//声明myblocks=^(void){NSLog(@"myblocks");};//给myblcok赋值myblocks(); //调用

2— 带参的block

intmultiplier=7; int(^myBlock)(int)=^(intnum){ returnnum*multiplier; }; printf("%d",myBlock(3));

// prints "21"

3——有返回值,带参block

int(^myblocks2)(inta,intb)=^(inta,intb){intc=a+b;returnc;};intret=myblocks2(2,3);

// prints "5"

截至到目前位置,都先声明了block,再对block 赋值!其实你完全可以直接使用一个block

Using a Block Directly

In many cases, you don’t need to declare block variables;(大部分情况下,你无需声明一个block 变量)

本例子:将数组逆序

char*myCharacters[3]={"TomJohn","George","CharlesCondomine"};qsort_b(myCharacters,3,sizeof(char*),^(constvoid*l,constvoid*r){char*left=*(char**)l;char*right=*(char**)r;returnstrncmp(left,right,1);});//myCharactersisnow{"CharlesCondomine","George","TomJohn"}

Blocks with Cocoa

SeveralmethodsintheCocoaframeworkstakeablockasanargument,typicallyeithertoperformanoperationonacollectionofobjects,ortouseasacallbackafteranoperationhasfinished.ThefollowingexampleshowshowtouseablockwiththeNSArraymethodsortedArrayUsingComparator:.Themethodtakesasingleargument—theblock.Forillustration,inthiscasetheblockisdefinedasanNSComparatorlocalvariable:

take a block as an argument,(将block 作为参数)typically either to perform an operation on a collection of objects, or to use as a callback after an operation has finished.(通常要么执行操作在对象集合、或者操作回调)下面简单的例子展示了如何在NSArray 的方法sortedArrayUsingComparator:中使用block,该方法将block作为一个参数。为了解释说明,本例子的block被定义为一个NSComparator 的本地变量。

本例子:NSArray 排序

NSArray*stringsArray=[NSArrayarrayWithObjects:@"string1",@"String21",@"string12",@"String11",@"String02",nil];staticNSStringCompareOptionscomparisonOptions=NSCaseInsensitiveSearch|NSNumericSearch|NSWidthInsensitiveSearch|NSForcedOrderingSearch;NSLocale*currentLocale=[NSLocalecurrentLocale];NSComparatorfinderSortBlock=^(idstring1,idstring2){NSRangestring1Range=NSMakeRange(0,[string1length]);return[string1compare:string2options:comparisonOptionsrange:string1Rangelocale:currentLocale];};NSArray*finderSortArray=[stringsArraysortedArrayUsingComparator:finderSortBlock];NSLog(@"finderSortArray:%@",finderSortArray);/*Output:finderSortArray:("string1","String02","String11","string12","String21")*/

__block Variables(__block 变量(关键字))

__block 修饰临时变量,可让其变为全局的变量。(引用自身作用域外的变量)

__block 参数全局声明

__blockintsum=0;int(^myblock3)(inta,intb)=^(inta,intb){sum=a+b;returnsum;};ret=myblock3(2,3);NSLog(@"block3%d",ret);

NSArray*stringsArray=[NSArrayarrayWithObjects:@"string1",@"String21",//<-@"string12",@"String11",@"Strîng21",//<-@"Striñg21",//<-@"String02",nil];NSLocale*currentLocale=[NSLocalecurrentLocale];__blockNSUIntegerorderedSameCount=0;NSArray*diacriticInsensitiveSortArray=[stringsArraysortedArrayUsingComparator:^(idstring1,idstring2){NSRangestring1Range=NSMakeRange(0,[string1length]);NSComparisonResultcomparisonResult=[string1compare:string2options:NSDiacriticInsensitiveSearchrange:string1Rangelocale:currentLocale];if(comparisonResult==NSOrderedSame){orderedSameCount++;}returncomparisonResult;}];NSLog(@"diacriticInsensitiveSortArray:%@",diacriticInsensitiveSortArray);NSLog(@"orderedSameCount:%d",orderedSameCount);/*Output:diacriticInsensitiveSortArray:("String02","string1","String11","string12","String21","Str\U00eeng21","Stri\U00f1g21")orderedSameCount:2*/