OC中Block基本使用

Block的说明

Block是OC语言中的一种数据类型,它是预先准备好的代码,在需要的时候就直接执行的。可以当做参数传递,也可以当做返回值,一般在实际开发中前者用的比较多。在多线程和网络也使用得相当频繁,一般都是作为回调使用!其形式类似于C语言中指向函数的指针,在开发中也是反向传值的一种方式。

Block的基本用法

  • Block常见的4种形式

    1.无返回值,无参数:void(^myBlock)() = ^{};

    2.无返回值,有参数:void(^myBlock)(int ,int) =^(int ,int ) {};

    3.有返回值,无参数:int(^myBlock)()= ^{};

    4.有返回值,有参数: int (^myBlock)(int,int) = ^(int,int){};

  • Block代码块不好记,苹果提供快捷键在实现文件的方法体中 敲 inl 直接回车,就可以出现一个block的基本块

    在这里插入图片描述

Block使用注意点

  • block 内部可以访问外部的变量

     int a = 10;
     void(^myBlock)() = ^{    
         printf("%d",a);//10
     };
      myBlock();
    
  • block 中可以定义与外界同名的变量,遵守就近原则

    int a = 10;
    void(^myBlock)() = ^{
    int a = 20;
    printf("%d",a);//20
    };
    myBlock();
    
  • block内部不能修改外界的变量值,如果需要修改,外部需要__block修饰,(__block修饰后栈区变量的地址会变化为堆区地址),不加__block 转成c++是就是值传递,加上之后就是地址传递,可以修改对应的值,如果 block 中使用了外部变量,会对外部变量做一次 copy 。

          __block int a = 10;
          void(^myBlock)() = ^{
              a = 20;
              printf("%d",a);
          };
          myBlock();
    
  • 在控制器中调用block时,并且在这个block里面使用了这个类对象(self)一定要在外部将类对象定义成弱指针类型,这就能够避免循环引用,内存泄露的问题。

    1.声明定义一个block

    #import <UIKit/UIKit.h>
    //设计Block
    typedef void(^loadMoreBlock)();
    @interface LoadMoreView : UIView
    //Block:常用copy 尽量不用*
    @property(nonatomic,copy)loadMoreBlock block;
    @end
    

2.在.m文件中调用block

       //调用block:顺序
  		-(void)loadBtnBlock
  		{
  		    if (self.block) {
  		        self.block();
  		    }
  		}
   

3.在控制器中调用

 __weak ListTableViewController *weakself = self;
  //回调
  self.loadMoreView.block = ^{
      NSLog(@"block invoke!");
      NSString *data = [NSString stringWithFormat:@"row %ld",[weakself.dataArray count] +1];
      [weakself.dataArray addObject:data];
      [weakself.tableView reloadData];
  };

版权声明:本文为bingjiewenqing原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。