公司的这几天iOS面试

我们公司准备新招一个iOS开发,要求是中上的水平,然后让我出一套面试题。我认为既然是中上水平,那么基础和项目实战都要考,我自己也应该只能算中等水平。然后,我就出了一套题,没想到的是我出的第一题,竟然到现在还没有一个人答对(我们喊过来面试的都是毕业2年以上的)。我问了下同事,他们说,这个题有点刁钻。题目内容是这样的:
NSString *s1 = @"Hello world"; NSString *s2 = @"Hello world";请问 s1 == s2的返回值是YES还是NO? 写法①
很刁钻吗?这个不应该是基础题吗?

针对评论说,没有给答案

首先这道题的答案是:YES。其实,这道题真的不刁钻,刁钻的题可能是下面这样:
NSString *s1 = @"hello"; NSString *s2 = [[NSString alloc] initWithString:s1];请问s1==s2的返回值? 写法②
或者是下面这样:
NSString *s1 = [NSString stringWithFormat:@"hello"];NSString *s2 = [NSString stringWithFormat:@"hello"];请问s1==s2的返回值? 写法③
当然,上面的这几种写法,答案都是YES。可能学习Java的人,现在会有疑问了,可能认为写法②和写法③都应该是不相等的。
这道题考的两个字符串是否相等,这里的相等是绝对相等,不是isEqualToString的方式,比较是两个字符串的内存地址是否一样。那这里就要从字符串在内存中的存储区间来看了,记得在Xcode6以前,字符串的定义还可以这么写:NSString *s2 = [[NSString alloc] initWithString:@"hello"],但是Xcode 6以后,这种写法就会有警告,说明编译器在字符串的存储这一块做了改变。

运行结果
不管是直接定义一个字符串常量还是使用allocinit的方式,字符串的存储都是在常量区,至于常量区是在堆区还是栈区,这个需要查证,因为不同的版本可能会有变动(java也是在Java7做了改变),而使用stringWithFormat方式创建的字符串,如果字符串相同也是只有一份,但是很明显,不是放在常量区的。也就是说使用同样的方式创建的相同的字符串(NSString)都是只有一份的。(NSMutableString是不一样的)
那是不是所有的字符串都是存在常量区呢?答案是否定的。你可以试着把NSString换成NSMutableString试试。很显然,这道题答对或者答错基本不会影响开发,但是,它是基础,也同样重要。

还有一道题是关于深拷贝和浅拷贝的区别,我发现也是基本没人说明白,我就在网上搜索了一下,发现网上的大多数答案也是出乎意料的大面积错误,也有正确的,但是很少。很多博客都是说的,浅拷贝是指针拷贝,深拷贝是重新创建对象。凡是这么答题的,我都会问他们指针拷贝是否就是两个不同引用指向同一个地址,他们大多也给了我肯定的答案。

我记得在学习Java和C++的时候,老师都讲过这个问题.。
Java里面的浅拷贝是实现Cloneable接口,实现里面的clone方法,类似下面这样:

class B implements Cloneable {
    String name = null;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }
}

 class A implements Cloneable
{

    B b = null;
    public A() {
        b = new B();
    }
    @Override
    protected Object clone()  {
        // TODO Auto-generated method stub
        A a = null;
        try {
            a = (A) super.clone();
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return a;
    }
}

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        A a1 = new A();
        a1.b.name = "a1";
        A a2 = (A) a1.clone();
        a2.b.name = "a2";
        
        System.out.println("第一个对象的name:"+a1.b.name + "第二个对象的name:"+a2.b.name);
    }
} ```

深拷贝则是下面这样:

class B implements Cloneable {
String name = null;
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}

class A implements Cloneable
{

B b = null;
public A() {
    b = new B();
}
@Override
protected Object clone()  {
    // TODO Auto-generated method stub
    A a = null;
    try {
        a = (A) super.clone();
                a.b = (B) b.clone(); // 差别就在这里。多了对实例变量的拷贝。
    } catch (CloneNotSupportedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return a;
}

}

public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
A a1 = new A();
a1.b.name = "a1";
A a2 = (A) a1.clone();
a2.b.name = "a2";

    System.out.println("第一个对象的name:"+a1.b.name + "第二个对象的name:"+a2.b.name);
}

}```
差别只是一个是换壳,一个是把壳子包括里面的内容都换了。有的人用公司打比方,就是一个是换了个公司名,里面的员工不变;另外一个是换了公司名,里面的员工参照原公司重新招。差不多就是这个意思,只是人不能clone。
Objective-C 里面原理是一样的,只是遵守的是NSCopying协议,实现里面的- (id)copyWithZone:(nullable NSZone *)zone;方法。

针对评论说没有给出答案

上面的java代码其实已经给了答案了,OC可以类比过来。具体代码晚点发出来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,342评论 0 35
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,001评论 0 12
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 1,955评论 0 7
  • 1.写一个NSString类的实现 +(id)initWithCString:(c*****t char *)nu...
    韩七夏阅读 3,739评论 2 37
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,278评论 0 6