block   回调函数(程序块)

block是ios4.0之后出来的一门新技术,应用也非常广泛,只要我们撑握其使用的翘门,使用其来也是非常简单的,而且它能将传统程序简单化

      程序中" ^"代表程序块也就是block,在我们接下来的程序中都会有^

          block的声明一般都是    返回类型(^block名称)(参数,...,...)   如void(^firstBlock)(float ,float);

      block的定义可以是如下  firstBlock=^(float r,float t){NSLog(@"value is %f",r*t };

    我们也可以将声明和定义放在一块实现如下:

     void(^firstBlock)(float,float)=^(float r,floatt){NSLog(@"value is %f",r*t};

    当我们需要使用它的时候执行如下 firstBlock(5.0,6.0);

   在这里需要注意一下,我们使用它的时候应该在能使用其范围内才能使用它,就跟变量一样,只有在其作用域内才能使用它,写到这里觉得block跟变量差不多,说到跟变量一样这里提一下

   就是block引用外部的非对象型变量的时候一般是不能更改它的,除非在变量前加上__block,对于对象型的变量在block的内部引用的时候一般引用计数都会加1,为了打破这种retain circle,可以在对象前加__block,这样block块就不会维护这个对象了


    block不仅能单独使用,还可以作为方法的参数如下

   -(void)changeValue:(void(^)(float,float))block,还过这里的block的写法和上面不一样,请注意

   使用也很简单 [self changeValue:firstBlock];

   

  再就是block还可以代替delegate进行回调,如有A和B两个UIViewController,给B定义一个属性block,从A界面到B中时设置B的block,当我们需要在B中的任何时候执行回调的时候,直接执行block就行了,说到这里就不得不说一下作为属性block是不能进行retain的只能进行copy.还有block还可以用于多线程,这个以后再说

   

[plain]  viewplain copy print ?
  1. #import   
  2.   
  3. @interface BIDViewController : UIViewController  
  4. - (IBAction)clicked:(UIButton *)sender;  
  5. - (IBAction)secondClicked:(id)sender;  
  6. - (IBAction)thirdClicked:(id)sender;  
  7. @property (retain, nonatomic) IBOutlet UILabel *lb;  
  8.   
  9. @end  

 

 

[plain]  viewplain copy print ?
  1. #import "BIDViewController.h"  
  2. #import "FirstViewController.h"  
  3. @interface BIDViewController ()  
  4. {  
  5.     float (^oneFrom)(float);  
  6. }  
  7. @end  
  8.   
  9. @implementation BIDViewController  
  10.   
  11. - (void)viewDidLoad  
  12. {  
  13.     [super viewDidLoad];  
  14.     // Do any additional setup after loading the view, typically from a nib.  
  15.     oneFrom=^(float aFloat){  
  16.         float result=aFloat-1.0;  
  17.         return result;  
  18.     };  
  19. }  
  20.   
  21. - (void)didReceiveMemoryWarning  
  22. {  
  23.     [super didReceiveMemoryWarning];  
  24.     // Dispose of any resources that can be recreated.  
  25. }  
  26.   
  27. - (IBAction)clicked:(UIButton *)sender {  
  28.     NSLog(@"%f",oneFrom(10.0));  
  29.       
  30.       
  31.     void(^thirdfrom)(float)=^(float r){  
  32.         NSLog(@"%f",r*5.0);  
  33.     };  
  34.     [self changeValue:thirdfrom];  
  35. }  
  36.   
  37. - (IBAction)secondClicked:(id)sender {  
  38.     __block CGFloat height=10.0;  
  39.     void(^twoFrom)(float)=^(float t){  
  40.         height+=t;  
  41.     };  
  42.     NSLog(@"height is %f",height);  
  43.     twoFrom(5.0);  
  44.      NSLog(@"height  is %f",height);  
  45. }  
  46.   
  47. - (IBAction)thirdClicked:(id)sender {  
  48.     FirstViewController* first=[[FirstViewController alloc] init];  
  49.     __block UILabel* blockLb=_lb;  
  50.     //回调  
  51.     first.testBlock=^(float r){  
  52.         blockLb.text=[NSString stringWithFormat:@"%f",r];  
  53.     };  
  54.     [self presentModalViewController:first animated:YES];  
  55. }  
  56.   
  57. -(void)changeValue:(void(^)(float))from  
  58. {  
  59.     [NSThread sleepForTimeInterval:3.0];  
  60.     from(10.0);  
  61. }  
  62. -(void)dealloc  
  63. {  
  64.   
  65.     [_lb release];  
  66.     [super dealloc];  
  67. }  
  68. - (void)viewDidUnload {  
  69.     [self setLb:nil];  
  70.     [super viewDidUnload];  
  71. }  
  72. @end  

[plain]  viewplain copy print ?
  1. #import   
  2.   
  3. @interface FirstViewController : UIViewController  
  4. @property(nonatomic,copy)void(^testBlock)(float);  
  5. - (IBAction)btnClicked:(id)sender;  
  6.   
  7. @end  

[plain]  viewplain copy print ?
  1. #import "FirstViewController.h"  
  2.   
  3. @interface FirstViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation FirstViewController  
  8. @synthesize testBlock;  
  9. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
  10. {  
  11.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
  12.     if (self) {  
  13.         // Custom initialization  
  14.     }  
  15.     return self;  
  16. }  
  17.   
  18. - (void)viewDidLoad  
  19. {  
  20.     [super viewDidLoad];  
  21.     // Do any additional setup after loading the view from its nib.  
  22. }  
  23.   
  24. - (void)didReceiveMemoryWarning  
  25. {  
  26.     [super didReceiveMemoryWarning];  
  27.     // Dispose of any resources that can be recreated.  
  28. }  
  29.   
  30. - (void)dealloc {  
  31.     [super dealloc];  
  32. }  
  33. - (void)viewDidUnload {  
  34.     [super viewDidUnload];  
  35. }  
  36. - (IBAction)btnClicked:(id)sender {  
  37.     if (testBlock) {  
  38.         testBlock(4.0);  
  39.     }  
  40.     [self dismissModalViewControllerAnimated:YES];  
  41. }  
  42. @end  

你可能感兴趣的:(block   回调函数(程序块))