今日头条ios实习生

一面:

简单聊了一下(暖场),面试官说和我同专业(惊讶),人也非常随和,全程让人感觉很放松。

1.OC语言有什么特点?和其他语言(Java、Python)的区别?

答:动态语言、运行时特性、消息转发机制。

2.为什么说OC是动态的?

答:将对象类型的确定由编译期延迟到了运行时。

3.有没有用过分类?分类与扩展及匿名分类的区别?

4.self和super的区别?(super是保留关键字,不是指针)

5.定义一个对象,它的内存大小是多少?

6.能否动态地给对象添加属性?

7.atomic和nonatomic的区别?

8.@property(atomic,strong) NSMutableArray *array,这样写能否保证线程安全?

答:不能,atomic只针对getter和setter方法

9.如何保证线程安全?

答:使用信号量。

10.解释一下runloop。用runloop写个简单的接口(动手写代码,实现一个定位功能,要求单例、多线程实现、使用CLLocationManager。后来解释说因为我面试的时候使用的黑苹果,所以手写估计有点困难,故不了了之。面试官还说我们老板(导师)太抠了,额,我们导师挺好的)。

11.看你简历中有写道开发了两款小程序,那你知道小程序的实现原理吗?

二面:

同样,先问了个人情况,毕业后有什么打算(是否读博)?什么时候开始接触iOS的?什么时候能开始实习?(问到这我还以为这面是HR)

1.以下代码的输出结果?

dispatch_async(main_thread) {
      dispatch_sync (main_thread) {
          print("123")
      }
     print("456")
}

dispatch_async(main_thread) {
      dispatch_sync (global_thread) {
          print("123")
      }
     print("456")
}

2.说一下你做的APP中的功能亮点

答:聊天功能...

3.如何保证对方一定能接收到消息?

答:采用的轮询和远程推送

4.说一下远程推送的流程。

5.苹果怎么知道远程推送给哪台设备?又如何知道推送给哪个应用?

6.下面两段代码有什么问题吗?

//(这道题问的和前一个面试官一个)
@property(nonatomic, strong) NSArray *array;
@property(nonatomic, strong) NSObject *obj;
thread1: self.obj = [NSObject new];
thread2: [self.obj perform....];

[nil perform....];

7.APP里哪些地方用到了多线程(初始化应用数据)?如何保证线程安全?

8.编写一个函数,实现以下功能:“Float字符串 -> Float数字”。

题目不难,但写了得有半小时左右,还是基础不扎实。 答:

-(CGFloat)strToNum:(NSString *)str{
    CGFloat result=0.0f;
    CGFloat suffixNum=0.0f;
    bool isSuffix=false;
    int suffixCount=0;
    int pointCount=0;   
    NSArray *array=[NSArray arrayWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"."];
    for(int i=0;i<str.length;i++){
        NSString *c=[str charAtIndex:i];
        if(![array containsObject:c]){
            //判断是否包含非法字符,转换成ASCII码,判断是否在0-9范围内
            //,以及是否包含","
            return;
        }
        else if([c isEqualToString@"."]){
            isSuffix=true;
            pointCount++;
            if(pointCount>1){
                return;
            }
        }
        else{
            int tNum=[c intValue];
            if(!isSuffix){//计算整数部分
                if(tNum>(CGFloatMax/10)){
                    return;
                }
                result=tNum+result*10;
            }
            else{ //计算小数部分
                suffixCount++;
                suffixNum=tNum+suffixNum*10;
            }
        }
    }
    suffixNum=suffixNum*1.0/(suffixCount);
    result=result+suffixNum;
    return result;   
}

面试官: 你写的代码里有几个问题:

  • ①判断非法字符的时候每次都要遍历,耗费资源,可以用ASCII码来判断;(我解释说起始开始有想到过,但是忘了具体怎么写了...)
  • ②如果字符串中包含两个“.”呢?(这里面试官没有考虑周全,还应该判断字符串开头是否为“+”或“-”,以及是否包含多个这样的字符)
  • ③没有考虑内存溢出的情况。如果是一个很长的字符串呢?如果小数部分很长呢?

9.最后问一个问题(转眼一看都快下午6点了):用过block吗?怎么解决循环引用的问题?

答:用weak属性

10.见过在block外面使用weak属性,然后在里面加strong的吗?为什么呢?

答:没见过。(一脸懵...)

总的来说,今日头条的面试体验还不错,面试官也都挺随和,注重面试者的基础。