美文网首页
iOS知识整理-Block

iOS知识整理-Block

作者: 皮皮蟹pipixie | 来源:发表于2019-10-15 14:56 被阅读0次

Block是将函数及其执行上下文封装起来的对象

变量截获

局部变量截获 是值截获

NSInteger num = 3;
NSInteger(^block)(NSInteger) = ^NSInteger(NSInteger n){
       return n*num;
};
num = 1;
NSLog(@"%zd",block(2));  
// 输出是6而不是2,原因就是对局部变量num的截获是值截获。
NSMutableArray * arr = [NSMutableArray arrayWithObjects:@"1",@"2", nil];
void(^block)(void) = ^{
        NSLog(@"%@",arr);//局部变量
        [arr addObject:@"4"];
    };
[arr addObject:@"3"];
arr = nil;
block();
// 打印为1,2,3.因为block内部会截获arr,且引用修饰符相同。


局部静态变量截获 是指针截获

static  NSInteger num = 3;
NSInteger(^block)(NSInteger) = ^NSInteger(NSInteger n){
    return n*num;
};
num = 1;
NSLog(@"%zd",block(2));
// 输出为2,意味着num = 1这里的修改num值是有效的,即是指针截获。
// 同样,在block里去修改变量m,也是有效的。


全局变量,静态全局变量截获:不截获,直接取值。

static NSInteger num3 = 300;
NSInteger num4 = 3000;
- (void)blockTest {
    void(^block)(void) = ^{
        NSLog(@"%zd",num3);//全局变量
        NSLog(@"%zd",num4);//全局静态变量
    };
    block();
}
// 300, 3000

Block循环引用

当self持有Block,Block中又使用self时,就会产生循环引用。
解决办法:

  1. __weak来修饰self。当self有可能被释放时,可以在block内部再用__strong生成strongSelf;
    __weak typeof(self) weakSelf = self;
    self.setAlertBlock = ^(NSString *status) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
    };
  1. 在block内部使用完self后,将其置为nil,但这种方式有个问题,如果block一直不被调用,那么循环引用将一直存在。所以,我们最好还是用__weak来修饰self。

参考:Block原理、Block变量截获、Block的三种形式、__block

相关文章

  • iOS知识整理-Block

    Block是将函数及其执行上下文封装起来的对象 变量截获 局部变量截获 是值截获 〜局部静态变量截获 是指针截获 ...

  • Block 初见

    Block 初见 介绍 iOS block 的相关知识 目录 Block 背景知识 Block 使用方式 Bloc...

  • # iOS基础 # block知识整理

    什么是block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过bloc...

  • Block知识整理

    2018-10-26 编辑 :yzl 1. block定义 用Apple文档的话来说,A block is an...

  • iOS-Block知识点整理

    block 介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 为什么 weakSe...

  • iOS-2 Block

    block块 系列文章: iOS Block浅浅析 - 简书 iOS Block实现原理 iOS Block __...

  • SDWebImage4.0源码探究(二)具体代码拓展

    代码一 知识点:block参考:iOS中block的详解weakSelf、strongSelf <转自唐巧>Blo...

  • iOS Block存储域及循环引用

    系列文章:iOS Block概念、语法及基本使用iOS Block实现原理iOS Block __block说明符...

  • iOS Block实现原理

    系列文章:iOS Block概念、语法及基本使用iOS Block __block说明符iOS Block存储域及...

  • block循环引用问题

    在讲block的循环引用问题之前,我们需要先了解一下iOS的内存管理机制和block的基本知识。 iOS的内存管理...

网友评论

      本文标题:iOS知识整理-Block

      本文链接:https://www.haomeiwen.com/subject/zulsmctx.html