Block是OC语言中的一种数据类型,它是预先准备好的代码,在需要的时候就直接执行的。可以当做参数传递,也可以当做返回值,一般在实际开发中前者用的比较多。在多线程和网络也使用得相当频繁,一般都是作为回调使用!其形式类似于C语言中指向函数的指针,在开发中也是反向传值的一种方式。
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 内部可以访问外部的变量
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; @end2.在.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]; };