1.Block的本意

  1. block本质上也是一个OC对象,它内部也有个isa指针,
  2. block是封装了函数调用以及函数调用环境的OC对象,
  3. block是封装函数及其上下文的OC对象

2.block截获变量

  1. #import "SYDBlcok.h"
  2. // 全局变量----不截获全局变量
  3. int global_var = 4;
  4. // 静态全局变量-----不截获全局静态变量
  5. static int static_global_var = 5;
  6.  
  7. @implementation SYDBlcok
  8. -(void)method {
  9. // 基本数据类型的局部变量----只截获值
  10. int var = 6;
  11. // 对象类型的局部变量----连同所有修饰符一起截获
  12. __unsafe_unretained id unsafe_ibject = nil;
  13. __strong id strong_obj = nil;
  14. // 局部静态变量---以指针形式截获局部静态变量
  15. static int multiplier_static = 3;
  16. NSLog(@"multiplier_static:%d",multiplier_static);
  17. int(^Block)(int) = ^(int num) {
  18. NSLog(@"局部变量>基本数据类型:%d",var);
  19. NSLog(@"局部变量>对象类型%@----strong:%@",unsafe_ibject,strong_obj);
  20. NSLog(@"局部static:%d",multiplier_static);
  21. NSLog(@"全局变量%d",global_var);
  22. NSLog(@"静态全局变量:%d",static_global_var);
  23. return num * multiplier_static;
  24. };
  25. NSLog(@"判断执行顺序");
  26. // 局部静态变量 -----isa指针
  27. multiplier_static = 4;
  28. NSLog(@"result is %d",Block(2));
  29. }

编译后结果

  1. 2019-04-16 14:59:38.854104+0800 auditionTest[64047:1220987] viewDidLoad
  2. 2019-04-16 14:59:42.067785+0800 auditionTest[64047:1220987] multiplier_static:3
  3. 2019-04-16 14:59:42.067970+0800 auditionTest[64047:1220987] 判断执行顺序
  4. 2019-04-16 14:59:42.068081+0800 auditionTest[64047:1220987] 局部变量>基本数据类型:6
  5. 2019-04-16 14:59:42.068182+0800 auditionTest[64047:1220987] 局部变量>对象类型(null)----strong:(null)
  6. 2019-04-16 14:59:42.068276+0800 auditionTest[64047:1220987] 局部static:4
  7. 2019-04-16 14:59:42.068366+0800 auditionTest[64047:1220987] 全局变量4
  8. 2019-04-16 14:59:42.068459+0800 auditionTest[64047:1220987] 静态全局变量:5
  9. 2019-04-16 14:59:42.068563+0800 auditionTest[64047:1220987] result is 8

cpp文件解析

  • FuncPtr:指向调用函数的地址
  • __main_block_desc_0 :block描述信息
  • Block_size:block的大小

3. block修饰符

  1. /**
  2. 修饰符的使用----对被截获变量进行赋值操作的时候
  3. */
  4. -(void)block_property {
  5. __block NSMutableArray *array = nil;
  6. // static、static global或者global变量 不需要添加__block
  7. void(^block)(void) = ^{
  8. // 使用array 初始化
  9. array = [NSMutableArray array];
  10. [array addObject:@""];
  11. };
  12. block();
  13. NSLog(@"array:%@",array);
  14. }
    // 赋值操作不需要修饰符
    -(void)block_property {
  1. NSMutableArray *array = [NSMutableArray array];
    // static、static global或者global变量 不需要添加__block
  2. void(^block)(void) = ^{
  3. // 使用array 初始化
    array = [array addObject:@"123"];
    };
    block();
    NSLog(@"array:%@",array);
    }

4.循环引用

  1. // 循环引用
  2. -(void)aroundBlock {
  3.  
  4. _array = [NSMutableArray arrayWithObject:@"block"];
  5. // __weak NSArray *weakArray = _array;
  6. // kWeakSelf(_array);
  7. NSString*(^strBlock)(NSString *str) = ^(NSString *num) {
  8. return [NSString stringWithFormat:@"hello_%@",_array[]];
  9. // return [NSString stringWithFormat:@"hello_%@",weak_array[0]];
  10. };
  11. // self z持有block, block有成员变量 array,持有self
  12. strBlock(@"eden");
  13. }
  14.  
  15. -(void)aroundBlock {
  16.  
  17. _array = [NSMutableArray arrayWithObject:@"block"];
  18. // __weak NSArray *weakArray = _array;
  19. kWeakSelf(_array);
  20. NSString*(^strBlock)(NSString *str) = ^(NSString *num) {
  21. // return [NSString stringWithFormat:@"hello_%@",_array[0]];
  22. return [NSString stringWithFormat:@"hello_%@",weak_array[]];
  23. };
  24. // self z持有block, block有成员变量 array,持有self
  25. strBlock(@"eden");
  26. }
  1. // weakself 配合strongSelf 使用,防止在block执行的时候self提前突然被释放,也有可能闪退
  2. __weak __typeof__(self) weakself = self;
  3. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{
  4. __strong __typeof(self) strongself = weakself;
  5. [strongself doSomething];
  6. [strongself doOtherthing];
  7. });
  8. }
  9. -(void)doSomething {
  10. NSLog(@"doSomething");
  11. }
  12. -(void)doOtherthing{
  13. NSLog(@"doOtherthing");
  14. }
block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。
使用retain也可以,但是block的retain行为默认是用copy的行为实现的,因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。

iOS 面试全方位剖析 -- Block篇的更多相关文章

  1. 新浪微博资深大牛全方位剖析 iOS 高级面试

    第1章 课程简介本章对这门课程所讲述内容进行概要介绍,其中包括课程目标.适合人群,课程特色.课程收获.课程安排等.整个课程学习完结后,有机会获得电话模拟面试及内推. 1-1 课前必读(不看会错过一个亿 ...

  2. iOS面试贴士

    iOS面试小贴士 ———————————————回答好下面的足够了------------------------------------- 多线程.特别是NSOperation 和 GCD 的内部原 ...

  3. iOS 面试基础题目

    转载: iOS 面试基础题目 题目来自博客:面试百度的记录,有些问题我能回答一下,不能回答的或有更好的回答我放个相关链接供参考. 1面 Objective C runtime library:Obje ...

  4. web前端面试试题总结---css篇

    CSS 介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? (1)有两种, IE 盒子模型.W3C 盒子模型: (2)盒模型: 内容(content).填充(padding).边界(m ...

  5. 一些iOS面试基础题总结

    一些iOS面试基础题总结 目录 多线程 AutoLayout objc_msgSend Runtime 消息转发 Category NSObject 与 objc_class Runloop Auto ...

  6. iOS 面试秘籍全套

    栏目将持续更新--请iOS的小伙伴关注!   (答案不唯一,仅供参考,文章最后有福利) iOS面试题大全(上) iOS面试题大全(下) 目录: iOS面试题:Run Loop iOS面试题:性能优化 ...

  7. web前端面试试题总结---html篇

    HTML Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前.告知浏览器的解析器 ...

  8. iOS push全方位解析(二)【译文】"——生成OpenSSL证书,Provisioning Profile

    这是一篇来自raywenderlich的教程,内容翔实!结构简单透彻.讲解循序渐进.文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下: 1.[iOS push全方位解析](一) push的 ...

  9. IOS面试攻略

    IOS面试攻略(1.0) 2013-10-13 20:58:09|  分类: IOS面试 |  标签:ios知识点总汇  ios面试  |举报|字号 订阅     来自:伊甸网 @ 看到这个关键字,我 ...

随机推荐

  1. thinkphp3.2新部署是错

    下载好thinkphp3.2,使用M或者D方法是,报FILE: tp\ThinkPHP\Library\Think\Db.class.php LINE: 42 可能的错误是,配置文件中没有配置数据库连 ...

  2. linux没有eth0

    1.创建ifcfg-eth0 touch /etc/sysconfig/network-scripts/ifcfg-eth0 2.配置ifcfg-eth0 DEVICE=eth0 HWADDR=:0c ...

  3. zTree的后台数据绑定

    前台js: var treeNodes; $.ajax({ async: false, cache: false, type: 'POST', contentType: "applicati ...

  4. wp8使用现有sqlite数据库

    就是把现有文件转移到隔离空间即可 代码如下 private async void CopyDB()        {            StorageFile fage = await Appli ...

  5. 关于from..import 与import导入模块问题

    问题来源:导入PyQt5里面的模块时老是出错 1.from PyQt5 import QtWidgets.QApplication,QtWidgets.QtDialog #出错2.from PyQt5 ...

  6. 音频压缩(Speex使用&Opus简介)--转

    博客地址:http://blog.csdn.net/kevindgk GitHub地址:https://github.com/KevinDGK/MyAudioDemo 一简介 二局域网语音配置 三Sp ...

  7. 1147. Heaps (30)

    In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...

  8. bzoj 4817: [Sdoi2017]树点涂色 LCT+树链剖分+线段树

    题目: Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob可能会进 ...

  9. HDOJ1151有向图最小路径覆盖

    //有向图最小路径覆盖:从某一点出发沿着有向路径,不走回路,能将所有的结点遍历. #include<iostream> #include<cstdio> #include< ...

  10. ng2 中的全屏与退出全屏

    1.进入全屏 launchFullscreen(element) { if(element.requestFullscreen) { element.requestFullscreen(); } el ...