ios 添加block 类别_ios之Block的详细使用和具体说明

image.png

iOS代码块Block

一:概述

闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」;Block 是 Objective-C 对于闭包的实现。

代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量、作为参数、作为返回值,特殊的Block还可以保存一段代码,在需要的时候调用,目前Block已经广泛应用于iOS开发中,常用于GCD、动画、排序及各类回调。

其中,Block:

1:可以嵌套定义,定义 Block 方法和定义函数方法相似。

2:Block 可以定义在方法内部或外部。

3:只有调用 Block 时候,才会执行其{}体内的代码。

4:本质是对象,使代码高聚合。

使用 clang 将 OC 代码转换为 C++ 文件查看 block 的方法:

1:在命令行输入代码 clang -rewrite-objc 需要编译的OC文件.m

2:这时查看当前的文件夹里 多了一个相同的名称的 .cpp 文件,在命令行输入

open main.cpp 查看文件

二:Block定义

1.无参数无返回值

//无参无返回值

void (^myBlock) (void) = ^{

NSLog(@"无参无返回Block");

};

myBlock(); // block的调用

2.有参数无返回值

void (^myBlock3) (int a) = ^(int a){

NSLog(@"a == %d, 我就是有参数无返回值的block", a);

};

myBlock3(100); // //调用block

//控制台打印结果:a == 100, 我就是有参数无返回值的block

3.有参有返回值

//有参有返回值的block

int (^myBlock4)(int , int) = ^(int a, int b){

NSLog(@"-- %d, 我就是有参数有返回值的block", a +b);

return (a +b);

};

myBlock4(30 , 20); // //调用block

// 控制台打印结果:50, 我就是有参数无返回值的block

4.无参数有返回值的block(实际中很少用到)

//无参有返回值的block

int (^myBlock5)(void) = ^{

NSLog(@"我是一个无参数, 有返回值的block");

return 100;

};

myBlock5();

5.实际开发中常用typedef 定义Block。

例如:

image.png

//typedef 定义有参数有返回值的block

typedef int (^MyBlock3)(int c, int d);

这时,MyBlock3就成为了一种Block类型。

在定义类的属性时可以这样:

//block 修饰 作为属性

@property (nonatomic, copy) MyBlock3 threeBlock;

使用该block时:

//使用block

self.threeBlock = ^int(int c, int d) {

NSLog(@"block的返回值 == %d",c*d);

return c*d;

};

self.threeBlock(10, 20);

三:Block与变量

1.block 中可以访问局部变量

int a = 10;

void (^myBlock)(void) = ^{

NSLog(@"a的值为:%d", a);

};

myBlock();

//控制台输出结果:a的值为10

2.在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之前的旧值

int a = 10;

void (^myBlock)(void) = ^{

NSLog(@"a的值为:%d", a);

};

a = 20;

// 调用后控制台输出"a的值为:10"

myBlock();

3.在Block中不可以直接修改局部变量

int a = 10;

void (^myBlock)(void) = ^{

// a++; //这一句报错

NSLog(@"a的值为:%d", a);

};

myBlock();

4.Block内访问__block修饰的局部变量

在局部变量前使用__block修饰,在声明Block之后、调用B

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在iOS开发中,可以使用Block和delegate来实现一对多的回调。使用delegate时,首先需要定义一个delegate协议,其中包含回调方法。然后在需要进行回调的地方,设置delegate并调用回调方法。具体实现可以参考以下代码示例:\[2\] ``` // 定义delegate协议 protocol FirstCellDelegate: class { func firstCellBtnTap(_ cell: firstTableViewCell) } // 在需要进行回调的地方设置delegate并调用回调方法 weak var delegate: FirstCellDelegate? // 调用回调方法 if let delegate = self.delegate { delegate.firstCellBtnTap(self) } // 实现delegate回调方法 func firstCellBtnTap(_ cell: firstTableViewCell) { let cellIndexPath = tableView.indexPath(for: cell) print("delegate回调 section:\(cellIndexPath?.section ?? 0), row:\(cellIndexPath?.row ?? 0)") } ``` 另外,使用Block也可以实现一对多的回调。Block可以作为函数表达式传递给API,可以选择性地存储,并且可以被多个线程使用Block不仅包含了在回调时需要执行的代码,还包含了执行期间所需的数据。具体实现可以参考以下代码示例:\[3\] ``` // 定义Block回调 typealias CallbackBlock = () -> Void // 在需要进行回调的地方使用Block进行回调 var callback: CallbackBlock? // 调用回调 callback?() ``` 通过使用Block和delegate,可以实现一对多的回调,满足不同场景下的需求。 #### 引用[.reference_title] - *1* [Block实现iOS回调](https://blog.csdn.net/feelinghappy/article/details/119870367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [iOS Block与Delegate的用法,各自优缺点及使用场景](https://blog.csdn.net/huangshanfeng/article/details/82106580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值