• iOS 中Block的基础用法


    1.直接使用时:

    /**直接定义block
     *  void        (^whatTheFuck)     (NSInteger a,NSInteger b)    ;
     *    |             |                          |
     *  返回值       block名字                     参数列表
     */
     
    apple官方的例子:
    float (^oneFrom)(float);          1. 声明一个block对象
      
    oneFrom = ^(float aFloat) {       2. 赋值,使该对象引用一个栈中的函数块
        float result = aFloat - 1.0;  3.执行函数 
        return result; 
    };
    要将block视为oc的一种对象,而不做特殊声明时是一个局部变量,函数执行完后就会被回收 

    我个人没有这么使用过

    2.作为属性使用时 :

    贴上此demo的github link:

    https://github.com/lyleLH/blockDemo
    程序目的:完成一次vc1 push到vc2,vc2再pop回vc1时反向传值
     1.appdelegate拥有一个viewcontroller类型的对象vc1
     
     2.viewcontroller拥有一个viewController2类型的对象vc2
     3.在viewController2中利用typedef 定义了一个block类型 :

            /**typedef 一个类型(block)
             *  typedef       void         (^useName)     (UITextField * txf);
             *     |           |                |                |
             *  定义开始       返回值            类型名            参数列表
             */ 

    typedef void(^userName)(UITextField * txf);//定义一个block类型 ,无返回值,参数是一个UITextField对象
     4.viewController2中有一个userName的block属性,
      作为属性主要是为了保证在vc2中作为全局对象,并且在vc1中能够访问到此对象
     @property (nonatomic,copy)userName userName;
    
    
    
     5.当用户输入完毕,点击返回上一页时

      会将文本框的作为参数传递给vc1

      vc1中来获取次此文本框的文本并显示在lable上

      此时在vc2中执行此block:
        if(_userName) {   
               _userName(self.texf); 
    
           }   
    
      最好是加上是否不为nil的判断

      此处是详细的抱错解读:

       http://stackoverflow.com/questions/4145164/why-do-nil-null-blocks-cause-bus-errors-when-run
     6.vc1中会开始执行vc2所拥有的block属性指向的函数块 :
      
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.vc2 = [[ViewController2 alloc] init];
    
        __weak typeof(self) weakSelf = self;
    
        self.vc2.useName = ^(UITextField * texf) {   //会执行此函数块
    NSLog(@"%@",texf.text); mark.text = texf.text; weakSelf.name = mark.text; NSLog(@"self.nameIn with weak:%@",weakSelf.name);
    }
    
    

      

     6.作为属性使用时一定不要忘记一点:

      在vc1中执行block时要确保vc2不能为空,

    即注意我的vc1中block执行的代码是写在
    self.vc2 = [[ViewController2 alloc] init] 之后的
      
     
    
    
     
  • 相关阅读:
    Chrome使用video无法正常播放MP4视频的解决方案
    ArcGIS 按掩膜裁剪地形
    bilibili 分P视频 需下载哔哩哔哩投稿工具
    U盘/硬盘数据恢复
    visio 2010、2013、2016、2019安装包
    经纬度WGS84地理坐标系转换成CGCS2000坐标系步骤,必备!
    Git 配置多个用户邮箱以及在 Sourcetree 中使用
    Chrome 插件 一键保存当前打开的所有标签页
    Cesium粒子系统学习
    破解ArcGIS坐标系之惑: 从基本概念到常用操作
  • 原文地址:https://www.cnblogs.com/lyleLH/p/4911263.html
Copyright © 2020-2023  润新知