博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
01 iOS中Block的基础用法
阅读量:6247 次
发布时间:2019-06-22

本文共 2850 字,大约阅读时间需要 9 分钟。

##目录

1. 本文简介2. Block简介3. Block的修饰4. Block的模式5. Block的模式6. Block简单用法举例7. Block结合typedef使用复制代码

王巍:

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

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

####3. 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进行操作。

####4. Block的定义格式

返回值类型 (^block变量名)(形参列表) = ^(形参列表) {};复制代码

调用Block保存的代码

block变量名(实参);复制代码

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

####5. Block的模式

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

####6. Block简单用法举例

无参数无返回值的Block

/** *  无参数无返回值的Block */- (void)func1 {    /**     *  void :就是无返回值     *  emptyBlock:就是该block的名字     *  ():这里相当于放参数。由于这里是无参数,所以就什么都不写     */    void (^emptyBlock)() = ^(){        NSLog(@"无参数,无返回值的Block");    };    emptyBlock();}复制代码

有参数无返回值的Block

/**     *  调用这个block进行两个参数相加     *     *  @param int 参数A     *  @param int 参数B     *     *  @return 无返回值     */    void (^sumBlock)(int ,int ) = ^(int a,int b) {        NSLog(@"%d + %d = %d",a,b,a+b);    };    /**     *  调用这个sumBlock的Block,得到的结果是20     */    sumBlock(10, 10);复制代码

有参数有返回值的Block

    /**      *  有参数有返回值      *      *  @param NSString 字符串1      *  @param NSString 字符串2      *      *  @return 返回拼接好的字符串3      */         NSString *(^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){
        return [NSString stringWithFormat:@"%@%@",str1,str2];     };     //调用logBlock,输出的是 我是Block     NSLog(@"%@", logBlock(@"我是",@"Block")); 复制代码

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

ViewController2的实现

#import 
@interface ViewController2 : UIViewController/** * 定义了一个changeColor的Block。这个changeColor必须带一个参数,这个参数的类型必须为id类型的 * 无返回值 * @param id */typedef void(^changeColor)(id);/** * 用上面定义的changeColor声明一个Block,声明的这个Block必须遵守声明的要求。 */@property (nonatomic, copy) changeColor backgroundColor;@end复制代码
- (void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event { // 声明一个颜色 UIColor *color = [UIColor redColor]; // 用刚刚声明的那个Block去回调修改上一界面的背景色 self.backgroundColor(color);}复制代码

ViewController1的实现

- (void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event { ViewController2 *vc =[[ViewController2 alloc]init]; // 回调修改颜色 vc.backgroundColor = ^(UIColor *color){ self.view.backgroundColor = color; }; [self.navigationController pushViewController:vc animated:YES];}复制代码

转载于:https://juejin.im/post/5a3c5a896fb9a045204c671d

你可能感兴趣的文章
nyist 42 一笔画 (欧拉回路 + 并查集)
查看>>
用javascript实现用户登录验证
查看>>
博客05--查找
查看>>
进程与线程
查看>>
git 创建本地分支、提交到远程分支
查看>>
什么是http?
查看>>
pthreads v3下的同步处理synchronized
查看>>
10.第一个小项目
查看>>
SDS(Simple Dynamic String)一个简易动态字符串库
查看>>
swfit-pod使用
查看>>
(九)easyUI之选项卡
查看>>
日志分析工具ELK(三)
查看>>
PAT (Advanced Level) 1049. Counting Ones (30)
查看>>
HDU 5763 Another Meaning
查看>>
session详解
查看>>
scroll滚动条
查看>>
mysql链接超时错误
查看>>
Win10 安装 Linux子系统 Ubuntu18.04 / Kali Linux 的体验
查看>>
才发现用git Gui也能上传项目到gitHub,下面分享一下经验
查看>>
P1462 通往奥格瑞玛的道路
查看>>