面试啊面试~

  1. 下面代码打印 true 还是 false

    id arr = [[NSArray alloc] init];
    if ([[arr class] isKindOfClass:[NSArray class]]) {
    NSLog(@"true");
    } else {
    NSLog(@"false");
    }

    答案: 打印 false 1.jpeg 分析: 因为 NSArray 运用了类蔟 (Class clusters) 的设计模式,类簇其实是对现实的一种抽象和封装,基于抽象工厂模式 (Abstract Factory Pattern)NSNumberNSStringNSArray等均是如此。 如想更深入的了解相关概念,可以查阅下面两篇文章: 1. Sunny大神写的《从NSArray看类簇》 2. 《Objective-C类族和工厂模式》 代码在请见Demo中的 Demo2

  2. 下面代码打印什么内容?

    NSMutableSet *mSet = [[NSMutableSet alloc] init];
    [mSet addObject:@[@1, @2]];
    NSLog(@"1---%@", mSet);
    NSMutableArray *mArr = [[NSMutableArray alloc] initWithObjects:@1, nil];
    [mSet addObject:mArr];
    NSLog(@"2---%@", mSet);
    [mArr addObject:@2];
    NSLog(@"3---%@", mSet);
    [mSet addObject:@[@1, @2]];
    NSLog(@"4---%@", mSet);

    答案: 2.png 分析:

    • 集合(NSMutableSet)和数组(NSMutableArray)有相似之处,都是存储不同的对象的地址;不过NSMutableArray是有序的集合,NSMutableSet是无序的集合。

    • 集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度更快,但是它没有顺序。当插入相同的数据时,不会有任何效果。

      第一次输出时,创建了一个包含 @[@1, @2]NSMutableSet 第二次输出时,向已经创建的 mSet 中添加一个可变数组 第三次输出时,向前面创建的 mArr 中添加一个 @2,可以成功的将 @[@1, @2] 这个 mArr 添加到 mSet 中,应该是因为 @[@1, @2]__NSArrayImArr__NSArrayM ,不能成功的判断相等 第四次输出时,由于集合内已经存在相同的 @[@1, @2],而 mSet 中的元素是不能重复的,所以没有成功添加

      代码在请见Demo中的Demo3

Title: 面试啊面试~

Date: 2017.11.09

Author: zhangpeng

Github: https://github.com/fullstack-zhangpeng