Block和函数指针很像
比如这两句
1、
[geocoder reverseGeocodeLocation:newLocation
completionHandler:^(NSArray *placemarks, NSError *error){
for (CLPlacemark *place in placemarks) {
NSLog(@"name,%@",place.name); // 位置名
NSLog(@"thoroughfare,%@",place.thoroughfare); // 街道
NSLog(@"subThoroughfare,%@",place.subThoroughfare); // 子街道
NSLog(@"locality,%@",place.locality); // 市
NSLog(@"subLocality,%@",place.subLocality); // 区
NSLog(@"country,%@",place.country); // 国家
}
}];
2、(void)^block(NSArray*,NSError*) = ^(NSArray *placemarks, NSError *error){
for (CLPlacemark *place in placemarks) {
NSLog(@"name,%@",place.name); // 位置名
NSLog(@"thoroughfare,%@",place.thoroughfare); // 街道
NSLog(@"subThoroughfare,%@",place.subThoroughfare); // 子街道
NSLog(@"locality,%@",place.locality); // 市
NSLog(@"subLocality,%@",place.subLocality); // 区
NSLog(@"country,%@",place.country); // 国家
}
};
[geocoder reverseGeocodeLocation:newLocation
completionHandler:block];
是等价的,编译的时候并不会运行block里的代码,只是会在
[geocoder reverseGeocodeLocation:newLocation
completionHandler:block];这个的时候传入block的指针。而真正的是否运行或者什么时候运行取决于reverseGeocodeLocation:
completionHandler:方法里什么时候调用改block快。
block于普通函数指针的区别是可以把block定义在函数的内部,和一些字段的共享。使用block快推荐使用第一种模式,因为第一种模式比较直观。代码不用到处找,而第二种则比较清晰,易于理解。