iOS面试遇到的问题.

iOS面试题

关于工作,最近一直在思考着将来需要成为什么样的人,现在需要付出什么,朋友们腾讯,百度,阿里各种大厂打拼着自己的事业。而我现在各种高不成低不就,有点心塞,借此,记录一下一路面试过来的一些经验,也时刻提醒下自己。


1.关于cocoaPod 简单关于install和update的区别,本地的索引index是如果工作的。


2.关于看过的一些源码,需要大概的了解他设计思路,比如GCDAsyncSocket,AFNetWorking,SDWebImage等,源码解析这一块,需要好好分析分析


3.GCD方法,比如A,B,C三个异步现场在运行,D线程需要拿到A,B,C线程运算的结果才能进行下一步。这里需要用到GCD的什么方法。


4.Block很好用,遇到的有什么问题呢,用__block、__weak修饰的变量在Block里面会泄露的情况呢。


5.TCP,UDP的运作模式,基于GCDAsyncSocket的源码的解析


6.动画,画图等基础知识需要好好稳固一遍。


7.assgin copy weak strong 有什么区别,从内存的方面说一下,一般用在什么地方


8.NSArray,NSMutableArray一般用copy 还是用 strong来修饰


9.NSNotificationCenter 的同步异步问题


10.iOS App的启动原理,从打开程序到渲染出第一个界面,具体经过了什么操作。

初面电面:内存管理,属性,weak,strong,iskind of class,isllember,copy mutecopy的原理,block,runtime,kvo,load方法,类的,controller生命周期,消息转发,GCD用了哪些方法,线程安全,加锁。 内存管理(MRC和ARC两者之间怎么配合,会不会有内存泄露)笔试题大概有三道关于内存管理; 多线程管理:runloop,GCD等; Runtime消息查找,kvo,viewdidlod等几个方法排序; 直接调用法和performseletor的区别。

OMG: 内存ARC的实现,drock的原理,runloop的原理,多线程有哪些方式,viewlayer的区别,使用drawrect有哪些问题,webviewnative交付方式,AVfouation,displaylink,block的原理,知道有哪些锁 ,一个界面出现一段时间白屏,是什么原因。

字符串 abcsdf 的内存 Int 指针的内存 堆和栈的区别 进程 线程 和 堆栈的关系 死锁的条件 两条线程 分别执行累加10次的结果 Tcp拥塞控制和流量控制 Https的数据是对称还是不对称加密 快速排序 无序数组取最大和最小

  1. 内存管理,MRC和ARC
  2. 常用的属性修饰符及其作用
  3. copy和mutableCopy
  4. viewcontroller的声明周期
  5. view和layer的区别
  6. runtime是如何将weak修饰的对象置为nil的
  7. runtime和runloop的实现原理,自动释放池是什么时候将对象释放
  8. 多线程的方式,分别谈谈
  9. 做了哪些性能优化
  10. NSNull是啥?Nil、nil、NSNil
  11. Block的原理,需要注意什么?系统方法中的一些block是否需要注意循环引用?
  12. 单例的使用,优缺点,需要注意什么?
  13. KVO的实现原理
  14. 一些第三方库,其实现原理和机制
  15. 自定义实现一个动画,需要设置哪些参数?
  16. sqlite和cordata
  17. 算法吧。。
  18. dispatch_once_t是怎么实现的?
  19. atomic和nonatomic的却别?atomic一定是线程安全的吗?NSCache是线程安全的吗? 分类和扩展的区别 从编译的角度来看他们两个有什么不一样,当时好像是这么问的。

http://fish.yulingtianxia.com/2015/03/20/2015-3-20-Alipay-Interview/ 大神博客 面试方向

腾讯面试题 1.autorelease嵌套,系统怎么处理的 2.arc原理,处理原理 3.mrc或者arc是怎么破循环应用的 4.线程安全 5.NSOpearation可不可以停止 6.http状态码,自己写http框架,缓存,异步,并发高性能的解决方案 答:HTTP状态码100以上是请求接受成功,200以上是正确,302是请求重定向,400以上是请求链接错误或者找不到服务器,500以上是服务器错误 7.断点续传方案 8.UI、动画、动画优化方案,UITableViewCell优化方案 9本地数据库海量数据如何提高查询效率和存储效率 10.索引的缺点

  1. autorelease 嵌套, 系统是怎么处理的? 在`NSAutoReleasePool`中会有一个array保存所有需要被`autorelease`的对象, 由于我们要确保在保存对象时array不会对该对象进行强引用(retainCount plus 1), 我们需要用CFMutableArrayRef. 由于每一个线程都有自己的autoReleasePool, 所以我们需要保存该线程中所创建的所有autoreleasepools,每创建一个autoreleasepool, 我们可以把它放入一个stack里,然后将这个stack保存起来 这里可以使用:
     NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
     NSString *key = @"com.my.thread-local.releasepool";
     CFMutableArrayRef stack = threadDict[key];
     if (!stack) {
        stack = CFArrayCreateMutable(NULL, 0, NULL);
        [threadDict setObject:(id)stack forKey:key];
     }
    

    dealloc的时候,首先遍历当前autoReleasePool里所有对象,发送release, 然后release保存所有对象的CFMutableArray (CFRelease(_objects)). 然后遍历保存在thread里的stack,由于我们将所有在该线程内创建的autoreleasepool都存入这个stack里,我们只需要release所有在self之后的出现的autoreleasepool, 然后把self从stack里移除。由于每一个autoreleasepool都遵从这样的逻辑,这其实就是一个递归的调用。

  2. ARC 原理 ARC (Automatic Reference Counting), 在对象被创建时,ARC会保存一大堆关于该对象的信息:对象类型,所有的属性等等,当我们不再需要该对象的时候,ARC会帮助我们销毁该对象。 当我们allocinit一个对象实例时,编译器会在该实例使用完后插入objc_release去销毁该对象。如果我们是在使用properties的时候,该property的getter会被写成: ```objective-c
    • (Test *)test { return objc_retainAutoreleaseReturnValue(_test); } ``` 可以看到,所有的properties都被retain/autorelease了, 当引用properties时,编译器还会将caller改写为:objc_retainAutoreleaseReturnValue([self test]). 这里出现了两次的retain/autorelease,而编译器会优化的只使用一次。
  3. MRC 和 ARC怎么破循环引用(retain cycle) 使用__weak__unsafe_unretained
  4. 线程安全 不知道要问什么,问lock?还是其他?lock的话有:NSLock, OSSpinLock, NSRecursiveLock, pthread_mutex_t. 我们还可以用serial dispatch_queue_t来作lock。还有dispatch_barrier也可以。至于用哪个,就要具体分析了。
  5. NSOperation可不可以停止 调用cancel方法可以将NSOperationQueue当前状态设为cancelled,在operation运行中我们要不断的检查当前的operationQueue的状态,看isCancelled返回是否为真,若为真,则立刻结束operation.
  6. HTTP状态码,自己写http框架,缓存,异步,并发高性能的解决方案 根据我的经验,用过的HTTP状态码有: 200 OK, 201 Created, 302 Redirect, 304 Not Modified, 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 408 Request Time out, 500 Internal Error, 503 Server Not Available。网上能找到全部的状态码,但个人觉得记住一些常用的就足够了,当碰到特殊情况要使用其他状态码,查资料就好了。 对于http框架,在ios中,通常通过封装NSURLSession来完成网络层的开发,主要注意的是网络层应独立,只完成与后台API的通信,把数据处理或其他与网络通信无关的内容分离开来。 缓存,除非有特殊要求,个人建议还是使用NSURLCache或者NSCache来完成。如果服务器支持的话,应该好好利用304状态码的特性,这样会节省流量,而且网络响应会快些。 异步这个我觉得不用多说了吧?NSURLSession都是异步的。 对于并发高性能:需要知道的是,NSURLSession在iOS中最多可以有4个tasks同时运行,所以应该复用所创建的NSURLSession, 在它之上创建不同的tasks。如果像是tableview中加载图片,可以创建一个队列(queue), 如果tasks超过4个,把超过的放入这个队列中,当之前的任务完成时,检查队列中有没有等待的,如果有,把它们从队列中取出来,然后[task resume]
  7. 断点续传方案 可使用NSURLSession来完成. 主要通过以下的方法 ```objective-c
    • (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler;
    • (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData;
       如果不是使用NSURLSession, 则要麻烦一些,首先必需在暂停时记录下当前已接收的文件长度,在下一次开始时设置HTTP header里的`Range`:
       ```objective-c
       NSString *range = [NSString stringWithFormat:@"bytes=%lld-", self.receivedLength];
       [request setValue:range forHTTPHeaderField:@"Range"];
      
  8. UI, 动画优化, UITableViewCell优化 UI, 动画优化要根据实际情况以及profiling的结果来进行具体分析,光这样问还真不知道该怎么回答。 UITableViewCell的优化也是如此,但是一般的套路是profiling, 尽量少加subviews, 减少off-screen rendering, 比如圆角图片,可以在下载图片时在后台直接画圆角在图片中。下载图片时尽量使用caching。在加载数据时,尽量减少数据处理的时间,尽量不要fetching core data 等等。
  9. 本地数据库海量数据如何提高查询效率和存储效率 在ios中存储数据基本上就是plist, sqlite 和core data (NSUserDefault其实也是plist), plist建议用在存储简单而且数据量不大的情况,而且对于查询没有太多要求的。sqlite可以高效的查询和存储数据,但是缺点是: 大专栏  iOS面试遇到的问题.C API, 要自己做封装,而且每次都需要读写硬盘,对数据变化不敏感,要手动更新界面从而反应数据中的变化 在iOS开发中,除非有特殊需求,一般都建议使用Core Data. 如何提高查询效率:
    1. 设置合适的index.
    2. 优化predicate,对于string类型,尽量不要使用==
    3. 使用batchSize
    4. 合理使用batchLimit
    5. 对于需要用到的relationship objects,可以使用setRelationshipKeyPathsForPrefetching来减少Faulting overhead.
    6. 可以使用batchFaulting来减少Faulting overhead 如何提高存储效率:
    7. 尽量避免在main thread中写数据
    8. 不要在Core Data中保存图片,文件等数据
    9. 对于删除,更新,尽量batch
    10. 注意调用[NSManagedObjectContext save:]的时机,尽量是由在后台运行的NSManagedObjectContext来完成写入。
  10. 索引的缺点
    1. 需要空间储存索引
    2. 创建和维护索引需要耗费时间
    3. 当删除,插入和更新数据是,索引也需要进行更新,这样降低了写数据的速度。

阿里-p6-一面 (答案下礼拜更新)

1.介绍下内存的几大区域? 2.你是如何组件化解耦的? 3.runtime如何通过selector找到对应的IMP地址 4.runloop内部实现逻辑? 5.你理解的多线程? 6.GCD执行原理? 7.怎么防止别人动态在你程序生成代码 8.YYAsyncLayer如何异步绘制? 9.优化你是从哪几方面着手?

  1. 简述push原理,push的证书和其它的右什么不一样?
  2. viewcontroller的一些方法的说明viewDidLoad, viewWillDisappear, viewWillAppear方法的 顺序和 作用?
  3. frame 和 bounds 的 区别 ,bound的大小改变frame 改变吗?
  4. sqlite中插入特殊字符的方法和接收到处理方法。
  5. 谈谈你对数组和连表认识,还有你是怎么用他们的? 7. socket编程简述
  6. asihttp代码原理 ,异步请求的原理,异步请求最大数目,为什么只能这么多?
  7. http请求方式?
  8. uiview的圆角属性设置方法。 (m_mainImgView.layer.cornerRadius = 6; m_mainImgView.layer.masksToBounds = YES;)
  9. masksToBounds属性的作用。(决定子layer是否被当前layer的边界剪切。默认是NO。)

1. 简述push原理,push的证书和其它的右什么不一样? 第 一阶段:BeejiveIM服务器把要发送的消息、目的iPhone的标识打包,发给APNS。 第二阶段:APNS在自身的已注册Push服务 的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。 第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。 2. viewcontroller的一些方法的说明viewDidLoad, viewWillDisappear, viewWillAppear方法的 顺序和 作用? viewDidLoad:在视图加载后被调用 viewWillAppear:视图即将可见时调用。默认情况下不执行任何操作 viewDidAppear: 视图已完全过渡到屏幕上时调用 viewWillDisappear:视图被驳回时调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作 viewDidDisappear:视图被驳回后调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作 先执行viewDidLoad再执行viewWillAppear。 3. frame 和 bounds 的 区别 ,bound的大小改变frame 改变吗? frame:描述当前视图在其父视图中的位置和大小。 bounds:描述当前视图在其自身坐标系统中的位置和大小。 改变。 4. sqlite中插入特殊字符的方法和接收到处理方法。 除’其他的都是在特殊字符前面加“/”,而 ‘ -> ‘’ 。方法:keyWord = keyWord.replace(“/”, “//”); 5。谈谈你对数组和连表认识,还有你是怎么用他们的? NSArray 用于对象有序集合(数组),初始化一个数组时,经常使用 initWithObject 和 initWithObjects。没有s的表示使用一个指针初始化NSArray,初始化后,这个NSArray的实例只有一个数据,所以在调用没有s的函数的时候是不能以nil结束的;但是有s的就不一样了,哪怕只有一个数据,或者没有数据,必须使用一个nil结束。还有一个NSMutableArray可变对象数组,可以进行删除添加排序等一系列操作。 NSSet 用于对象无序集合,同数组相比,集合是一个无序的;不同元素的集合。数组中的元素可以重复,但是集合不同。 NSDictionary用于键值映射,key-value, key-value, ….. 一系列键值对。key(键)在整个dictionary是唯一的,通过key可以查询其对应的一个或多个value(值)。

它是基于TCP/IP协议,Socket就是一个可以连通网络上不同计算机程序之间的管道,把一堆数据从管道的A端扔进去,则会从管道的B端(也许同时还可以从C、 D、E、F„„端冒出来)。管道的端口由两个因素来唯一确认,即机器的IP地址和程序所使用的端口号。Socket可以支持数据的发送和接收,它会定义一种称为套接字的变量,发送数据时首先创建套接字,然后使用该套接字的sendto等方法对准某个IP/端口进行数据发送;接收端也首先创建套接字,然后将该套接字绑定到一个IP/端口上,所有发向此端口的数据会被该套接字的recv等函数读出。如同读出文件中的数据一样。 TCP/IP的socket提供下列三种类型套接字。 流式套接字、数据报式套接字、原始式套接字。 客户端编程步骤: 1:加载套接字库,创建套接字(WSAStartup()/socket());2:向服务器发出连接请求(connect());3:和服务器端进行通信(send()/recv());4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。 常用第三方库:1,Asyncsocket库 7。冒泡算法。

  • ( NSMutableArray *)mySort :( NSMutableArray *) arr { int i,j,len; NSObject *temp; len=[arr count ]; for (i=len- 1 ;i>= 0 ;i–) { for (j= 0 ;j<i- 1 ;j++) { if ([[arr objectAtIndex :j] compare :[arr objectAtIndex :j+ 1 ]]>]]> 0 ) { temp=[arr objectAtIndex :j]; [arr replaceObjectAtIndex :j withObject :[arr objectAtIndex :j+ 1 ]]; [arr replaceObjectAtIndex :j+ 1 withObject :temp]; } } } return arr; } 8。asihttp代码原理 ,异步请求的原理,异步请求最大数目,为什么只能这么多? ASIHTTPRequest是一个简易使用的类库,通过包装CFNetwork API 来简化 和服务器端的通讯. 它编写的语言是Objective-C 能够应用于Mac OS X and iPhone 平台的应用程序.

异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕 这个数量是跟cpu有关的,并发性取决于cpu核数,每个核只能同时处理一个任务.4核cpu理论上可以并发处理4个任务,如果按http来算就是4个请求,但是cpu是抢占式资源,所以一般来说并发量是要根据任务的耗时和cpu的繁忙度来计算4个左右只是个经验值你开10个短耗时的任务和几个长耗时任务的效率是不同的。 9。http请求方式? 通常,HTTP的请求方式有3种,分别是:POST、GET、HEAD。POST和GET方法是用于数据发送的。 POST:它将要发送的数据单独放在一个流中进行发送,而不是附加在URL地址后面,这样做的好处是这些数据不会出现在URL地址中。 GET:它将要发送的数据直接添加在URL后面,如: www.sina.com.cn?username=”“&password=”“, 这样的好处是可以直接将数据加在URL后,而不需在用另外的流来发送这些数据,但是缺点也显而易见,它将用户的信息显示出来了。 HEAD:它是请求资源的元数据方法。在具体的应用中,我暂时还没遇到过,也不去对它进行研究,需要是在学习。 10。uiview的圆角属性设置方法。 m_mainImgView.layer.cornerRadius = 6; m_mainImgView.layer.masksToBounds = YES; 11。 masksToBounds属性的作用。 决定子layer是否被当前layer的边界剪切,默认是NO。

百度面试题 一面:知识点 Objective C runtime library:Objective C的对象模型,Block的底层实现结构,消息发送,消息转发,内存管理 CoreData:多线程处理大量数据同步时操作 Delegate:Notification,Kvo,Kvc的优缺点 Runtime:category,method的实现机制。class的载入过程

二面:解决方案的能力 方案,适合的例子,关键的函数名称,方法,设计模式,算法 设计一个progress bar解决方案,追问到CoreGraphic,CGPath,maskLayer 设计一个popup View 追问呆Keywindow,UIWindow的layer,UIView hierarchy 从设计模式角度分析Delegate,Notification,KVO的区别,追问自己写的library和开源项目中用到的那些设计模式,有哪些好处或者坏处,能否改进 设计方案检测KVO的同步异步问题,willChange和didiChange的不同点,然后追问到有没有其他有没有类似的地方,Core Data的falut object 设计一个Kvo的系统 多线程,什么时候采用多线程方案以及理由,追问系统还有哪些在后台运行的thread,被追问到view lift circle,Ios6之后的不同以及内存管理 多线程中常常遇到的问题,优先级翻转,线程池等 百度需要一个一亿级别的app需要统计用户行为的日志系统,不使用数据库,只使用普通文件,设计一个系统,被追问到内存映射文件

1.微信如何搜索附近人 2.模糊搜索和精确搜索 3.即时通讯的UI布局,要是你做你会用多少个cell 4.有没有直播经验 5.最近的ipv6上架的问题 以及了解ipv6是什么 6.消息机制了解么?你用它做过什么! 7.iOS如何优化 8.instuments用过哪些工具,如何测试核心动画性能 9.沙盒机制 10.ffmpeg,opengl了解嘛 11.如何收集APP异常信息(比如:崩溃、闪退等) 12.离屏渲染了解么,了解的话说一下你一般是从哪几方面操作的 13.了解GCD的信号量机制么!能谈谈你对它的理解么! 14.聊下RAC和MVVM,你对它的看法 15.block底层实现 16.响应链底的理解 17.KVC和KVO 18.lldb(gdb)常用的调试命令 19.热更新 20.GCD实现原理

1.there is a table named student,the table has some fields:id name age ….,if i know a student’s age and name ,i want to know this student’s information,how to write sql sentence? 2.how many http status code do you know? And what them mean? 3.what’s different betweent http get and http post? 4.how to encrypt your data when your app have some data interactions with back-end?

操作系统:进程中包含什么?进程间通讯方式?线程如何创建(linux)?内存管理分配问题? 网络:http和https区别?简要介绍下计算机网络。put请求和get请求?怎样分析网络数据包之类的 算法:有两个很大的txt文件分别保存了所有的QQ号和QQ会员号,从第一个txt中随意找出一个QQ号,判断它是不是会员号 智力题:假设你爸不识字你有文化,你家里有一头牛,帮你爸爸估计下它能卖多少钱?给你一头大水牛,称下它的重量

蘑菇街面试图

面试题

猜你喜欢

转载自www.cnblogs.com/sanxiandoupi/p/11699023.html
今日推荐