美文网首页
iOS中block的理解

iOS中block的理解

作者: 盖小聂 | 来源:发表于2018-09-28 14:42 被阅读0次

本文的主要内容涉及block的含义,完整的表达式,截获自动变量值,截获自动变量,内存管理以及避免循环引用,另附上2个习题。

1、block的含义:

带有自动变量的匿名函数,这个自动变量就相对于Objective-C对象的成员变量。

2、block完整的表达式:

^ 返回值类型 参数列表 {}

3、block是如何截获自动变量值的?

执行block语法时,block表达式中所使用的自动变量值被保存到Block结构体实例中。

4、block截获自动变量

截获的自动变量没有__block修饰符,可以使用但是不能赋值,只有采用__block修饰符的自动变量才能进行赋值操作。 block不能截获C语言的数组。

5、block的内存管理

block中若没有截获自动变量,那么block创建之初内存分配在数据区(_NSConcreteGlobalBlock),若block中截获了自动变量,block创建之初内存分配在栈上(_NSConcreteStackBlock),通过copy方法可以将block从栈上复制到堆上(_NSConcreteMallocBlock)。
在ARC下,下面情况不需要手动执行copy方法:
a、block作为函数返回值
b、block作为成员变量
c、方法名中含有usingBlock的cocoa系统方法以及GCD中的block

6、使用__weak避免block的循环引用
Question:

1、在block中使用类的成员变量为什么成员变量不需要加__block?
C语言中允许Block改写静态变量(静态局部变量),静态全局变量以及全局变量的值。

2、下面两段代码的输出结果分别是?
代码1:

   NSString *name =@"lh";
    void(^nameBlock)(void) = ^ {
        NSLog(@"name:%@",name);
    };
    name =@"xll";
    nameBlock();

代码2:

    __block NSString *name =@"lh";
    void(^nameBlock)(void) = ^ {
        NSLog(@"name:%@",name);
    };
    name =@"xll";
    nameBlock();

输出结果:代码1输出lh,代码2输出xll

相关文章

网友评论

      本文标题:iOS中block的理解

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