美文网首页
Block 解开多年来的误解

Block 解开多年来的误解

作者: CoderHG | 来源:发表于2017-09-09 12:05 被阅读424次
block2015.png

这张图是我在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之前要判空处理,这是有原因的。

block2017.jpg

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

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

HGBlock.jpg

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

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

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

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

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

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

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

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

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

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

四、说点其它

对于一个 Block 来说,在没有赋值的情况下 crash、这或许让我们有点匪夷所思,怎么就 Crash 了呢。如果不知道具体的原理,还真是让人不得其解。以为有一种情况,我们是很容易知道的。如下所示:

HGObject* obj = nil;
[obj test];

这是没有问题的、也很清楚的知道具体的原因。但是不要忽略了这种情况:

HGObject* obj = nil;
NSString *name = obj->_name;
NSLog(@"%@", name);

具体如下:


image.png

看到这里是否又想转牛角尖了,为什么这里的 addresss 的值是 0x10呢??具体的看我的定义吧:

@interface HGObject : NSObject {
    @public
    int _age;
    int _height;
    NSString* _name;
}

// 测试方法
- (void)test;

@end

看了定义,应该就明白为什么 addresss 的值是 0x10 了。

相关文章

  • Block 解开多年来的误解

    这张图是我在2015年的时候发现的新大陆,那时候也知道block是一种特殊的数据类型、也是一种特殊的对象(不同于N...

  • 时间会解开误解

    最近的我,有些人会觉得太正能量了,又有点达到极端,我自己心里很清楚,已经不再是过去的那个自己,自己心里也有很警惕。...

  • 嵌套block的应用(数据互传、响应式编程、链式编程)

    前言 什么是嵌套block?为了防止误解,先上代码 本文所说的嵌套block是指,像Block1那样,参数中有bl...

  • 被误解从何解除

    人生难免犯错,难免被误解,要懂得冷静的去用适合的方法解开这个误解。 道理是拿来要求自己,不是用来苛求他人。 有当别...

  • 每日写一物073:朋友

    我们对这个世界的理解 往往从误解开始 而许多的误解 又从称呼开始 从前一声“美女”, 概括了性别与姿色 现在的一声...

  • 2019-06-09

    在这个世界上,误解和怠惰也许比奸诈和恶意造成的过错还要多。 所以,如果有什么误解便一定要解开,不能总是想着什么都顺...

  • 误解

    误解无处不在。解开误解却又是如此之难。 有一个紧要的包裹,于周二下午送达。四五十公斤的重量。 快递员只答应送到电梯...

  • 解开世人对茅山神功的误解

    解开世人对茅山神功的误解 很多人听到茅山神功就觉得邪门,邪教,斗法,害人以及一些黑社会人物或下三流的人才会相信,才...

  • 解开对收集和积累素材的误解

    一直听人说,写新媒体文,要成文快、有深度,除了围绕主题找素材,重点是平时要积累好素材。 怎么积累?听了不少方法和技...

  • 是爱情啊

    德善和正焕之间真的有很多的误解和错过啊 有了误解没有及时解开便会再次促成错过 因为亲耳听到亲眼看到亲身感受到阿泽喜...

网友评论

      本文标题:Block 解开多年来的误解

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