OC中Block基本使用

    科技2022-07-10  169

    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]; };
    Processed: 0.019, SQL: 8