Block专题
Block对象是一段代码如:
^{
NSLog(@"这里是一个Block");
};
在一个花括号内有一套指令。但是没有函数名,只有一个。表示这段代码是一个Block对象
^(double dividend,double divisor){
double q = dividend/divisor;
return q;
};
这个Block对象有两个实参,一个返回值。
Block对象可以被当成一个实参来传递给可以接收Block的方法,很多苹果的类都有可以接受Block为实参的方法。
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSArray *originalString = @[@"SaueKraut",@"Raygun",@"Big Nerd Ranch",@"Mississippi"];
NSLog(@"original string: %@",originalString);
NSMutableArray *devowelizedString = [NSMutableArray array];
NSArray *vowels = @[@"a",@"e",@"i",@"o",@"u"];
void (^devowelizer)(id,NSUInteger,BOOL *);
devowelizer = ^(id string,NSUInteger i,BOOL *stop){
NSMutableString *newString = [NSMutableString stringWithString:string];
for(NSString *s in vowels){
NSRange fullRange = NSMakeRange(0, [newString length]);
[newString replaceOccurrencesOfString:s
withString:@""
options:NSCaseInsensitiveSearch
range:fullRange];
}
[devowelizedString addObject:newString];
};
[originalString enumerateObjectsUsingBlock:devowelizer];
NSLog(@"这里%@", devowelizedString);
}
return 0;
}
enumerateObjectsUsingBlock:方法要求传入的Block对象的三个实参类型都是固定的。第一个实参是对象指针,指向当前(枚举)的对象。该指针的类型是id,所以无论数组包含的是什么类型的对象,都可以将地址赋给指针。第二个实参的类型是NSUInteger,其值是当前对象在数组中的索引。第三个实参是指向BOOL变量的指针,该变量的默认值是NO。如果将该值设为YES,那么数组对象会在执行完当前的Block对象后终止枚举过程
网友评论