zoukankan      html  css  js  c++  java
  • [Objective-C] 020_ Block

    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的效果。

  • 相关阅读:
    洛谷1098 字符串的展开 解题报告
    洛谷1086 花生采摘 解题报告
    洛谷1125 笨小猴 解题报告
    洛谷1056 排座椅 解题报告
    洛谷1067 多项式输出 解题报告
    洛谷1003 铺地毯 解题报告
    JS在不同js文件中互相调用
    JS鼠标滚轮事件
    JS闭包
    PHP中header('content-type:text/html;charset="utf-8')和error_reporting()的作用
  • 原文地址:https://www.cnblogs.com/superdo/p/5081115.html
Copyright © 2011-2022 走看看