iOS中Block的基础

╰+攻爆jí腚メ 2022-06-09 05:23 271阅读 0赞

本章不会对Block做过多的实现研究。只是讲解基本的用法。纯粹基础知识。结合实际项目怎么去做举例。Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。

Block简介

Block是一种比较特殊的数据类型。它可以保存一段代码,在合适的时候取出来调用。

Block的修饰

ARC情况下
1.如果用copy修饰Block,该Block就会存储在堆空间。则会对Block的内部对象进行强引用,导致循环引用。内存无法释放。
解决方法:
新建一个指针(__weak typeof(Target) weakTarget = Target )指向Block代码块里的对象,然后用weakTarget进行操作。就可以解决循环引用问题。

2.如果用weak修饰Block,该Block就会存放在栈空间。不会出现循环引用问题。

MRC情况下
用copy修饰后,如果要在Block内部使用对象,则需要进行(__block typeof(Target) blockTarget = Target )处理。在Block里面用blockTarget进行操作。

Block的定义格式

返回值类型(^block变量名)(形参列表) = ^(形参列表) {
};
调用Block保存的代码
block变量名(实参);

默认情况下,Block内部不能修改外面的局部变量
Block内部可以修改使用__block修饰的局部变量

Block的模式

1.无参数无返回值的Block
2.有参数无返回值的Block
3.有参数有返回值的Block

Block简单用法举例

无参数无返回值的Block

  1. /**
  2. * 无参数无返回值的Block
  3. */
  4. -(void)func1{
  5. /**
  6. * void :就是无返回值
  7. * emptyBlock:就是该block的名字
  8. * ():这里相当于放参数。由于这里是无参数,所以就什么都不写
  9. */
  10. void (^emptyBlock)() = ^(){
  11. NSLog(@"无参数,无返回值的Block");
  12. };
  13. emptyBlock();
  14. }

有参数无返回值的Block

  1. /**
  2. * 调用这个block进行两个参数相加
  3. *
  4. * @param int 参数A
  5. * @param int 参数B
  6. *
  7. * @return 无返回值
  8. */
  9. void (^sumBlock)(int ,int ) = ^(int a,int b){
  10. NSLog(@"%d + %d = %d",a,b,a+b);
  11. };
  12. /**
  13. * 调用这个sumBlock的Block,得到的结果是20
  14. */
  15. sumBlock(10,10);

有参数有返回值的Block

  1. /**
  2. * 有参数有返回值
  3. *
  4. * @param NSString 字符串1
  5. * @param NSString 字符串2
  6. *
  7. * @return 返回拼接好的字符串3
  8. */
  9. NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){
  10. return [NSString stringWithFormat:@"%@%@",str1,str2];
  11. };
  12. //调用logBlock,输出的是 我是Block
  13. NSLog(@"%@", logBlock(@"我是",@"Block"));

Block结合typedef使用

自己定义一个Block类型,用定义的类型去创建Block,更加简单便捷。
这里举例一个Block回调修改上一下界面的背景颜色。
ViewController1 控制器1,ViewController2 控制器2
控制器1跳转到控制器2,然后在控制器2触发事件回调修改控制器1的背景颜色为红色。

ViewController2的实现

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController2 : UIViewController
  3. /**
  4. * 定义了一个changeColor的Block。这个changeColor必须带一个参数,这个参数的类型必须为id类型的
  5. * 无返回值
  6. * @param id
  7. */
  8. typedef void(^changeColor)(id);
  9. /**
  10. * 用上面定义的changeColor声明一个Block,声明的这个Block必须遵守声明的要求。
  11. */
  12. @property (nonatomic, copy) changeColor backgroundColor;
  13. @end
  14. -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
  15. //声明一个颜色
  16. UIColor *color = [UIColor redColor];
  17. //用刚刚声明的那个Block去回调修改上一界面的背景色
  18. self.backgroundColor(color);
  19. }

ViewController1的实现

  1. -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
  2. ViewController2 *vc =[[ViewController2 alloc]init];
  3. // 回调修改颜色
  4. vc.backgroundColor = ^(UIColor *color){
  5. self.view.backgroundColor = color;
  6. };
  7. [self.navigationController pushViewController:vc animated:YES];
  8. }

发表评论

表情:
评论列表 (有 0 条评论,271人围观)

还没有评论,来说两句吧...

相关阅读

    相关 IOS——Block

    Block:块语句,是IOS4.0以后引入的。Block是一种具有匿名功能的内嵌函数,他勇敢有一般函数的带参访问,拥有返回值,可以撷取被定义的词法作用域状态,可以选择性的修改词

    相关 IOS 理解Block

    Block一个带有自动变量的匿名函数。 匿名函数是因为Block没有函数名称,由^返回值类型,入参类型,表达式组成。但可以赋值给Block类型变量。 自动变量在Block

    相关 iOS block用法

    [iOS block的用法][iOS block] 本文来自台湾的某开发人员的博客,被墙,感觉讲的比较易懂,所以引过来。文字简体化了,原来是繁体,变数=变量,这个注意一下

    相关 ios block

    1.block的特点: > block是c语言; > > block是一种数据类型,可当做参数使用,也可以用作返回值;总之,对比int的用法用即可【定义的时候,最好跟函数对

    相关 iOSBlock基础

    本章不会对Block做过多的实现研究。只是讲解基本的用法。纯粹基础知识。结合实际项目怎么去做举例。Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用

    相关 iOSBlock

    一、概述 Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参