1.定义和使用Block
1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 9 - (void)viewDidLoad { 10 [super viewDidLoad]; 11 12 //定义block 无返回值,无参数 13 void (^nameBlock)() = ^ () { 14 NSLog(@"姓名: Block"); 15 }; 16 17 //定义block 有返回值,有参数 18 int (^ageBlock)(int) = ^(int age) { 19 NSLog(@"年龄: %d",age); 20 return age + 1; 21 }; 22 23 //调用block 24 nameBlock(); 25 int age = ageBlock(3); 26 NSLog(@"》》》年龄:%d",age); 27 nameAndAgeBlock(@"SD.Team",2015); 28 } 29 30 void (^nameAndAgeBlock)() = ^(NSString *name,int age) { 31 NSLog(@"姓名:%@,年龄:%d",name,age); 32 }; 33 34 - (void)didReceiveMemoryWarning { 35 [super didReceiveMemoryWarning]; 36 } 37 38 @end 39 40 Block 定义与使用
运行结果:
通过运行上面的简单代码示例,可以得知:
[1].在类中,定义一个Block变量,就像定义一个函数。
[2].Block可以定义在方法内部,也可以定义在方法外部。
[3].只有调用Block时候,才会执行其{}体内的代码。
2.__block关键字
在Block的{}体内,是不可以对外面的变量进行更改的,将会报错(Variable is not assigning (missing __block type)),比如下面:
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 int myAge = 25; 4 void (^updateAge)(int) = ^(int age){ 5 myAge = myAge + age; 6 NSLog(@"age:%d",myAge); 7 }; 8 }
要如何更正才能对外面的值呢?通过添加__block 关键字即可
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 __block int myAge = 25; 4 void (^updateAge)(int) = ^(int age){ 5 myAge = myAge + age; 6 NSLog(@"age:%d",myAge); 7 }; 8 9 updateAge(3); 10 }
3.Block作为property属性
如有一需求:在ViewController中,点击设置按钮,push到下一个页面SettingViewController,在SettingViewController的age输入框TextField中更新年龄,返回的时候,在ViewController的年龄Label上面显示已更新的年龄。可以通过delegate 来实现,delegate前面讲过了,这次我们就用block来实现.
SettingViewController:
1 //SettingViewController.h 文件 2 @interface SettingViewController : UIViewController 3 @property (nonatomic, copy) void (^updateAgeBlock)(NSString *age); 4 5 @end 6 7 //SettingViewController.m 文件 8 - (IBAction)updateAgeBtnClicked:(id)sender { 9 if (self.updateAgeBlock) { 10 self.updateAgeBlock(self.ageTextField.text); 11 } 12 [self.navigationController popViewControllerAnimated:YES]; 13 }
ViewController:
1 - (IBAction)settingClicked:(id)sender 2 { 3 SettingViewController *settingVC = [[SettingViewController alloc] initWithNibName:@"SettingViewController" bundle:nil]; 4 settingVC.updateAgeBlock = ^(NSString *age){ 5 [self updateAgeLabel:age]; 6 }; 7 [self.navigationController pushViewController:settingVC animated:YES]; 8 } 9 10 - (void)updateAgeLabel:(NSString *)age 11 { 12 self.ageLabel.text = age; 13 }
我们通过block方式同样达到了delegate的效果。
时间: 2024-08-08 22:05:48