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] 之后的
  
 

 
原文地址:https://www.cnblogs.com/lyleLH/p/4911263.html