来至:http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxUsing.html#//apple_ref/doc/uid/TP40007502-CH5-SW1
1.block是什么
int (^oneFrom)(int) = ^(int anInt) {
return anInt - 1;
};
printf("1 from 10 is %d", oneFrom(10));
分析:
1.int (^oneFrom)(int) => 1,第一个int为返回类型 2,^为block标志, block变量名为:oneFrom 3,(int)为参数类型
2.^(int anInt) { retrun anInt-1;}=>2,参数为anInt的一个block语句,可以说是一个block(我理解为没有名字的方法),把一个blcok赋给了一个变量.
3.oneFrom(10) 3,通过变量名可调用block。
2.将block作为方法的参数(说明方法的参数是一个没有名字的方法)
char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };
qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
char *left = *(char **)l;
char *right = *(char **)r;
return strncmp(left, right, 1);
});
红色部分为最后一个参数,也就是一个block,也是一个方法..
很多情下作为回调的一个方法,非常方便.
在多线程里有这样一个函数
void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t));
这个函数的作用为调用iterations次 block方法;
具体参数:第一个表示执行的迭代次数,第二个参数指定block将要提交的队列,第三个参数是block本身,它带有一个参数(当前迭代的索引)。
size_t count = 10;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(count, queue, ^(size_t i) {
printf("i=%lu\n", i);
NSLog(@"%@",@"ok");
});
可以变换为:
void (^doApply)(size_t i)=^(size_t i) {
printf("i=%lu\n", i);
NSLog(@"%@",@"ok");
};
size_t count = 10;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(count, queue,doApply );
开启的线程为:包括主线程一共6个;
输出结果为:
i=1
i=2
i=3
2013-03-21 01:48:35.757 suanfa[1061:1903] ok
i=4
2013-03-21 01:48:35.757 suanfa[1061:1803] ok
i=5
2013-03-21 01:48:35.757 suanfa[1061:1a03] ok
i=6
2013-03-21 01:48:35.757 suanfa[1061:403] ok
i=7
2013-03-21 01:48:35.759 suanfa[1061:1903] ok
i=8
2013-03-21 01:48:35.760 suanfa[1061:1a03] ok
i=9
2013-03-21 01:48:35.760 suanfa[1061:1803] ok
2013-03-21 01:48:35.760 suanfa[1061:403] ok
2013-03-21 01:48:35.760 suanfa[1061:1903] ok
2013-03-21 01:48:35.761 suanfa[1061:1a03] ok
而且每次输出ok时间段都不一样,可以证明队列是异步执行;
几个应用例子:
1.
__block BOOL found = NO;
NSSet *aSet = [NSSet setWithObjects: @"Alpha", @"Beta", @"Gamma", @"X", nil];
NSString *string = @"gamma";
[aSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
if ([obj localizedCaseInsensitiveCompare:string] == NSOrderedSame) {
*stop = YES;
found = YES;
}
}];
2.
NSArray *array = [NSArray arrayWithObjects: @"A", @"B", @"C", @"A", @"B", @"Z",@"G", @"are", @"Q", nil];
NSSet *filterSet = [NSSet setWithObjects: @"A", @"Z", @"Q", nil];
BOOL (^test)(id obj, NSUInteger idx, BOOL *stop);
test = ^ (id obj, NSUInteger idx, BOOL *stop) {
if (idx < 5) {
if ([filterSet containsObject: obj]) {
return YES;
}
}
return NO;
};
NSIndexSet *indexes = [array indexesOfObjectsPassingTest:test];
NSLog(@"indexes: %@", indexes);
block理解后其实没什么,而且很好用。