欢迎来到代码驿站!

iOS代码

当前位置:首页 > 移动开发 > iOS代码

iOS Block解开多年以来一直的误解

时间:2021-03-03 10:06:42|栏目:iOS代码|点击:

首先来了解下什么是Block

       (1)Block是OC中的一种数据类型,在iOS开发中被广泛使用

       (2)^是Block的特有标记

       (3)Block的实现代码包含在{}之间

       (4)大多情况下,以内联inline函数的方式被定义和使用

       (5)Block与C语言的函数指针有些相似,但使用起来更加灵活

这张图是我在2015年的时候发现的新大陆,那时候也知道block是一种特殊的数据类型、也是一种特殊的对象(不同于NSObject)。在执行的时候务必要先if判断一下,否者crach。我给一个block变量赋值nil,尽然也crach了。看下面的值,是NULL而不是nil。

一、特殊的对象类型

下面代码的正确性, 说明block也是一种对象类型:

{
 // 数组中有一个block成员
 NSArray* arr = @[^(NSString* name){
  NSLog(@"哈哈哈哈");
  return name;
 }];
 // 是不是就能说明, block本来也是一种特殊的对象
 NSString* (^b)() = arr.firstObject;
 NSLog(@"%@", b(@"CoderHG"));
}

以上代码的合法性,足以证明 Block 是一种特殊的对象类型。那么以后面试的时候,就可以装一下逼,大胆的说在 OC 中有三种不同的对象类型,分别是:NSObject、NSProxy 与 Block。

二、判空的重要性

在上面也提到在执行block之前要判空处理,这是有原因的。


尽然一个nil对象的block属性执行的时候也crach了。这可颠覆了我一直以来对block的理解。

但是、不管怎么的crach,只要是在执行之前if一下总是没有错的。那具体为什么会crash呢?请看下图解释:


上图中不仅介绍了为什么会闪退,同时还介绍了为什么闪退时的address=0x10。面试必备、面试必备、面试必备。

三、我的面试经过 (17年12月)

在美团面试第二轮的时候,被问到了,第二轮大概1个小时吧,面试官正想要结束面试的时候,最后来了这么一个问题,大概的经过是这样的:

1、如果调用一个赋值为空的 block,会发生什么情况?

看到这个问题,把我乐坏了。我所回答到的点有:直接 crash、block 是一个特殊的对象、赋值为 NULL 与 nil 都会闪退。
我忘记了一个成语叫乐极生悲,因为接下来的一个问题。

2、闪退的那个地址值(address)是多少?

一脸的蒙圈,怎么会问这个问题?。。。只能靠猜了,因为平时根本不会关注这个。应该是0x0,直接告诉的面试官是猜的。没想到他直接告诉我不是这个值,然后他再次抛出另一个问题。

3、这个值是0x10,你知道是为什么么?

我连第2问都不知道,第3问肯定是不知道的了。。。。。

后来的后来,才总结出上面的那张图片的内容。

谢谢~

总结

上一篇:iOS常见的几个修饰词深入讲解

栏    目:iOS代码

下一篇:iOS利用UIBezierPath + CAAnimation实现路径动画效果

本文标题:iOS Block解开多年以来一直的误解

本文地址:http://www.codeinn.net/misctech/73293.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有