写这篇文章的目的是由于前两天同窗想应聘iOS开发,从网上找了iOS面试题和答案让我帮忙看看。我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖。整篇题目30多个没有一个答案是对的,总结这篇面试题的做者对iOS机制根本就是只知其一;不知其二就敢发到网上,无论有心仍是无意都是坑害新人。因此在这里总结一下这几年面试别人和被别人面试遇到的一些我认为比较好的基础题目分享给你们,进阶题目在后续补充。个人理解若是有错漏请必定指出,很是感谢!html
从12年开始作面试官到如今已经三个年头了,这期面过不少形形色色的开发,有腾讯的、有百度的、有小公司的、有作外包的,还有彻底没有代码能力来作管理的。给个人感受是百度出品的技术能力最好,基础知识、技术细节掌握的很是的扎实而且自信。腾讯出品技术细节上也很是厉害,平均来讲比百度差一些,可是解决问题的能力很是强,思惟很活跃大局观好。小公司、外包公司的同窗技术细节、基础知识要差一些。我我的是很是反对以出身论英雄BAT出品就必定比其余公司的优秀,只能说BAT提供的技术氛围更好,你能够跟更多优秀的人共事,相比小公司技术进步更容易些。ios
这期间我也面了不少互联网公司,腾讯、百度、阿里、快播还有其余不少中小型公司,给个人感受是中国总体的互联网面试官的态度很是糟糕,面试官常常性习惯性的迟到,理由有开会啦、在吃饭啦,最离谱的是没有任何理由就让你在那里等。其实我以为如今这些公司啊尚未认清楚一个现状,就是绝大多数干开发的都只是来看看机会,不是来求职的,因此老是找不到人。一边说本身的公司多么求贤若渴,应聘者来了又不给予应有的尊重。我认为面试是很是很差的一个词,应聘过程应该叫面谈、review更合适,它是一个双向选择的过程。面试
我参加的面试不下五十次,只有两次面试官递给我一杯水,一次是腾讯的技术一面,后来那个面试官也是我最尊敬的组长,还有一次是快播的hr面。其余面试官直接无视汗流浃背顶着深圳烈日赶来面试的我,基本上每次面试完都是半脱水状态。面试更主要的是考察一个应聘者在正常环境下的工做能力而不是极端环境下的应激能力,面试官不是要把应聘者问倒、提一些刁钻的问题把他难住而是应该帮助应应聘者缓解他的紧张和压力,并适当的提示,让应聘者最大限度的发挥,这才是一个合格面试官最基本的素质。算法
如今进入本篇的正题。本篇的面试题是我认为比较好的iOS开发基础知识点,但愿你们看过这后在理解的基础上掌握而不是死记硬背。死记硬背很快也会忘记的。编程
深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,至关于对指向对象的指针进行复制,产生一个新的指向这个对象的指针,那么就是有两个指针指向同一个对象,这个对象销毁后两个指针都应该置空。深拷贝是对一个对象进行拷贝,至关于对对象进行复制,产生一个新的对象,那么就有两个指针分别指向两个对象。当一个对象改变或者被销毁后拷贝出来的新的对象不受影响。swift
实现深拷贝须要实现NSCoying协议,实现- (id)copyWithZone:(NSZone *)zone 方法。当对一个property属性含有copy修饰符的时候,在进行赋值操做的时候实际上就是调用这个方法。设计模式
父类实现深拷贝以后,子类只要重写copyWithZone方法,在方法内部调用父类的copyWithZone方法,以后实现本身的属性的处理安全
父类没有实现深拷贝,子类除了须要对本身的属性进行处理,还要对父类的属性进行处理。markdown
NSNotification是通知,也是一对多的使用场景。在某些状况下,KVO和NSNotification是同样的,都是状态变化以后告知对方。NSNotification的特色,就是须要被观察者先主动发出通知,而后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,可是其优势是监听不局限于属性的变化,还能够对多种多样的状态变化进行监听,监听范围广,使用也更灵活。网络
delegate 是代理,就是我不想作的事情交给别人作。好比狗须要吃饭,就经过delegate通知主人,主人就会给他作饭、盛饭、倒水,这些操做,这些狗都不须要关心,只须要调用delegate(代理人)就能够了,由其余类完成所须要的操做。因此delegate是一对一关系。
block是delegate的另外一种形式,是函数式编程的一种形式。使用场景跟delegate同样,相比delegate更灵活,并且代理的实现更直观。
KVO通常的使用场景是数据,需求是数据变化,好比股票价格变化,咱们通常使用KVO(观察者模式)。delegate通常的使用场景是行为,需求是须要别人帮我作一件事情,好比买卖股票,咱们通常使用delegate。
Notification通常是进行全局通知,好比利好消息一出,通知你们去买入。delegate是强关联,就是委托和代理双方互相知道,你委托别人买股票你就须要知道经纪人,经纪人也不要知道本身的顾客。Notification是弱关联,利好消息发出,你不须要知道是谁发的也能够作出相应的反应,同理发消息的人也不须要知道接收的人也能够正常发出消息。
dispatch_async(dispatch_get_main_queue(), ^{ //须要执行的方法 });
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //主队列 NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ //须要执行的方法 }]; [mainQueue addOperation:operation];
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil]; [self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES]; [[NSThread mainThread] performSelector:@selector(method) withObject:nil];
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES]; -(void)timerMethod { //调用类方法 [[self class] staticMethod]; } -(void)invalid { [timer invalid]; timer = nil; }
typedef struct objc_object *id
id能够理解为指向对象的指针。全部oc的对象 id均可以指向,编译器不会作类型检查,id调用任何存在的方法都不会在编译阶段报错,固然若是这个id指向的对象没有这个方法,该崩溃仍是会崩溃的。
NSObject *指向的必须是NSObject的子类,调用的也只能是NSObjec里面的方法不然就要作强制类型转换。
不是全部的OC对象都是NSObject的子类,还有一些继承自NSProxy。NSObject *可指向的类型是id的子集。
封装、继承、多态
设计模式6个原则
设计一个类的功能,如何划分粒度(单一职责)
接口隔离。
若是有一个鸟类,有飞的动做,一个鸵鸟继承它是合适的吗(里氏替换)
类之间的依赖如何依赖偶合度最小(依赖倒转)
高层依赖低层,低层不能依赖高层。依赖接口,不能依赖具体的类。
若是A要调用C函数,但C是B的成员类,应该如何设计?(迪米特)
如何设计类,能作到只增长代码,而不修改代码,有哪些经验(开放封闭)
经过设计模式解决。
转自:连接