今年2月中下旬,因为个人原因换了一份工作。这期间面试了四五家公司,大部分是D轮或者上市公司。我也从他们的书面采访中学到了东西。看到了自己的一些不足,所以想写出来与大家分享。如果能对正在面试的同学有所帮助就更好了。从面试题中,我们其实可以看到一些行业的发展和整体的人才需求。1.笔试题笔试基本都是一两个基础题,比如UITableView的复用机制,ARC的基本原理,如何避免retaincycle,说说对MVC的理解,内存管理机制的iOS。这点大家应该都非常清楚。笔试内容包括选择题、问答题,难度较大的是选择题。我采访了一个家庭,给了10道选择题。多选、少选、错选都不行。完成后,我感觉不太好。换个概念,这种题相当于考了4分。总之,遇到这种“恶心”的选择题,不要惊慌。静下心来一一筛选,应该就能得到不错的结果。接下来说说我当时回答得不是很好的几个问题。我当时就记住了,分享给大家。1、进程和线程的区别和联系这其实是操作系统的问题。当时,我被这个问题弄糊涂了。仔细想了想,用自己的理解回答了。下面说一个稍微完整的回答。大家可以先准备再准备,再问这种问题就完美回答了。进程是关于在某个数据集上运行的活动,具有某些独立功能的程序。进程是系统进行资源分配和调度的独立单位。线程是进程的实体,是CPU调度调度的基本单位。它是一个比进程更小,可以独立运行的基本单元。线程本身基本上不拥有系统资源,只有少数运行中必不可少的资源(如程序计数器、一组寄存器和堆栈),但可以属于同一个进程的其他线程共享所有进程拥有的资源。一个线程可以创建和撤销另一个线程;同一进程中的多个线程可以并发执行。2、并行与并发的区别并行是指两个或多个事件同时发生;并发是指两个或多个事件在同一时间间隔内发生。3.谈谈你对Block和delegate的理解。这是我当时的回答。委托的回调更面向过程,而块更面向结果。如果需要通知多步骤流程,则应使用委托。而当你只是想获取你请求的信息时(或者获取信息时出现错误信息),你应该使用块。(如果结合前面3个结论,会发现delegate可以保持所有事件中的状态,但是多个独立的block不能)4.说说instancetype和ida的异同点,相同点可以作为方法的返回类型b,区别①instancetype可以返回与方法的类相同类型的对象,id只能返回未知类型的对象;②instancetype只能作为返回值,不能像id一样作为参数5.category中可以使用声明属性吗?为什么??如果可以,如何实现?问这个问题的时候觉得可以实现,但是真的不知道怎么实现。后来回来查看,发现用到了Runtime的知识。贴答案给Category(类别)添加属性使用Runtime实现getter/setter方法@interfaceClassName(CategoryName)@property(nonatomic,strong)NSString*str;@end//实现文件#import"ClassName+CategoryName.h"#importstaticvoid*strKey=&strKey;@implementationClassName(CategoryName)-(void)setStr:(NSString*)str{objc_setAssociatedObject(self,&strKey,str,OBJC_ASSOCIATION_COPY);}-(NSString*)str{returnobjc_getAssociatedObject(self,&strKey);}@end6。isKindOfClass和isMemberOfClass的区别这道题很简单,但是当你当时紧张的时候,千万不要倒着答。isKindOfClass判断一个对象是否是类的成员,或者派生自类的成员isMemberOfClass只能判断一个对象是否是当前类的成员7.如何防止block中的retaincycle使用弱引用中断block_block中的retainincycleMRC不会引起retain;但在ARC中_block会导致保留。ARC8中应该使用_weak或者__unsafe_unretained弱引用。iOS多线程的实现方式有哪些?GCD中有哪些队列?它们是并行的还是串行的?iOS中主要的3个多线程编程工具是:NSThreadNSOperationGCDdispatchqueue分为以下三种:系统默认有一个串行队列main_queue和一个并行队列global_queue:GCD中有几种队列类型:主队列:与主线程功能相同。事实上,提交到主队列的任务都会在主线程中执行。主队列可以通过调用dispatch_get_main_queue()获取。因为主队列与主线程关联,所以这是一个串行队列。全局队列:全局队列是并发队列,被整个进程共享。进程中共有三个全局队列:高、中(默认)和低优先级队列。可以调用dispatch_get_global_queue函数传入访问队列的优先级。Userqueues:用户队列(GCD不这么叫这种队列,但是没有具体的名字来描述这种队列,所以我们称之为用户队列)是用函数dispatch_queue_create创建的队列:这些队列是串行的.正因为如此,它们可以用来实现同步机制,有点像传统线程中的互斥体。9.说说load和initialize的区别。这个问题当时问出来,我一下子真的傻了。虽然我用的比较多,但是我还真没注意比较这两个。看来学习的时候还需要多多请教呢。!10。CoreData是数据库吗?有哪些重要课程?当我问这是不是真的时,我注意到了它。表和OC对象的映射在那个时候还不是输入映射那么简单。底层还是存储在Sqlite3中,所以CoreData不是数据库。有以下六个重要的类:(1)NSManagedObjectContext(manageddatacontext)操作实际内容(操作持久层)作用:插入数据,查询数据,删除数据(2)NSManagedObjectModel(manageddatamodel)数据库所有表或数据结构,包括每个实体的定义信息功能:添加实体属性,建立属性间关系操作方法:视图编辑器,或代码(3)NSPersistentStoreCoordinator(持久化存储助手)相当于一个数据库连接器的作用:设置名称数据存储的、位置、存储方式、存储时机(4)NSManagedObject(托管数据记录)相当于数据库中的表记录(5)NSFetchRequest(获取数据的请求)相当于查询语句(6)NSEntityDescription(实体结构)相当于表结构。以上是我在三月面试时遇到的问题。我没有回答所有问题或没有回答问题。如果你什么都知道,请无视。然后是两道开放题,基本上是对实力和理解深度的全面考验。一是说说你对Runtime的理解,二是说说你对Runloop的理解。由于我个人对这两者的理解不是很深,这里就不贴出自己的理解了。如果你也觉得自己有欠缺,就多去网上看看吧!11、使用sprintf、strcpy、memcpy需要注意什么?,因为在电脑上敲代码真的很快就能分辨出谁是好人谁是坏人。当然,我也面试过这样的公司,给了一张白纸。有了代码补全,就没有编译器告诉你哪里错了,一切都取决于你的基本功。机考基本靠算法题。当然也有笔试最后几题出现的算法题,所以就看公司面试怎么安排了。2年前我也面试过iOS。那时候对算法和数据结构的要求很低。很多面试基本不会问这些问题。今年面试题多了,也让我眼前一亮,现在面试涉及到算法,不懂算法和数据结构的程序员的路会越来越窄。算法题对我来说不难。毕竟不是BAT这样的公司。简单的就是让你直接写一个算法。稍微进阶的有背景,然后叫你解决问题。其实和ACM的题一样。是的,但没那么复杂。我贴了几段最常被问到的算法。如果题目太难,我只能考自己的算法功底了。二分查找θ(logn)递归方法intbinarySearch1(inta[],intlow,inthigh,intfindNum){intmid=(low+high)/2;if(low>high)return-1;else{if(a[mid]>findNum)returnbinarySearch1(a,low,mid-1,findNum);elseif(a[mid]
