面试题汇总kg_第1页
面试题汇总kg_第2页
面试题汇总kg_第3页
面试题汇总kg_第4页
面试题汇总kg_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、序号问题1 1月月7 7日日面面试试题题汇汇总总1什么是TCP连接的三次握手2http协议的组成和特性;3怎样防止指针的越界使用问题?4谈谈webView的作用5FMDB的使用和对多张表的处理6说说数据库的左连接和右连接的区别7What is purpose of delegates?代理的作用?8What are mutable and immutabletypes in Objective C?obc中可修改和不可以修改类型。9When we call objective c is runtimelanguage what does it mean?我们说的obc是动态运行时语言是什么意思

2、?10Polymorphism?关于多态性11简单说一下时间响应的流程?12UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗?13动态绑定在运行时确定要调用的方法1 1月月6 6日日面面试试题题汇汇总总1自自动动释释放放池池是是什什么么, ,如如何何工工作作2obj-c有私有方法么?私有变量呢?3什么是键-值,键路径是什么4SDWebImage内部实现过程5UITableViewCell的重用机制6Category和继承的区别7#import跟#include的区别?8请写出你对MVC模式的理解9Objective-C如何对内存管理的,说说你的看法和解决方法

3、?10在项目什么时候选择使用GCD,什么时候选择NSOperation?11OC中的协议和java中的接口概念有何不同?12c和obj-c如何混用13如果有人恶意重复注册账号,让我写一个接口我怎么防止这样的事情。14浅拷贝和深拷贝区别是什么15链表和数组的区别16Object-C有多继承吗?没有的话用什么代替?cocoa中所有的类都是NSObject 的子类1 1月月6 6日日之之前前在Xcode中,需要编译混合Objective-C和C+的源码文件,需要将文件格式的后缀改为 ()在Objective-C声明一个类所要用到的编译指令是 ()使用Xcode创建工程时,支持同时创建的版本管理库是使

4、用protocol时,声明一组可选择实现与否的函数,需要在声明的前一行加上需要在手动管理内存分配和释放的Xcode项目中引入和编译用ARC风格编写的文件,需要在文件的CompilerFlags上添加参数项目开发流程、上架流程、上架遇到的问题及处理的方案,网络处理、AFN、http协议、app和H5页面的交互、SDWebImage的底层实现最常使用的地图是什么?集成地图时都使用了哪些技术?集成地图有什么用?使用过友盟吗?使用过融云吗?怎样实现信息的共享?简单给出购物车的实现思路?分析一下使用手机获取验证码注册账号的实现逻辑(给了一个示例图),发送到手机的验证码超过60秒钟后重新发送常使用的支付方

5、式有哪些?介绍一下集成逻辑手写一下单例方法说说NSOperation 和 GCD 的区别你实现过一个框架或者库以供别人使用么?如果有,请谈一谈构建框架或者库时候的经验;如果没有,请设想和设计框架的public的API,并指出大概需要如何做、需要注意一些什么方面,来使别人容易地使用你的框架。答案第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYNA

6、CK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)组成:http请求由三部分组成,分别是:请求行、消息报头、请求正文 特性:HTTP协议的主要特点可概括如下:1.支持客户/服务器模式。2.简单快速

7、:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传

8、送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。必须让指针指向一个有效的内存地址, 1防止数组越界2防止向一块内存中拷贝过多的内容 3防止使用空指针 4防止改变const修改的指针 5防止改变指向静态存储区的内容6防止两次释放一个指针 7防止使用野指针.http:/ 数据库左连接和右连接的区别:主表不一样通过左连接和右连接,最小条数为3(记录条数较小的记录数),最大条数为12(34)http:/ 主要是将数据类型的确定由编译时,推迟到了运行时。这个问题其实浅涉及到两个概念,运行时和多态。简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。多

9、态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。因此也可以说,运行时机制是多态的基础?多态,子类指针可以赋值给父类。这个题目其实可以出到一切面向对象语言中,因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。最重要的是转化成自我理解。一个UIView发出一个事件之后,首先上传给其父视图;父视图上传给其所在的控制器

10、;如果其控制器对事件进行处理,事件传递将终止,否则继续上传父视图;直到遇到响应者才会停止,否则事件将一直上传,直到UIWindow。模板模式,所有datasource和delegate接口都是模板模式的典型应用,组合模式composition,所有的containerview都用了这个模式观察者模式observer,所有的UIResponder都用了这个模式动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接 收者和被调用的方法。

11、运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C 代码中做任何工作,就可以自动获取动态绑定的好处当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。1. ojc-c是通过一种referringcounting(引

12、用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0,就会被系统销毁.2. NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.在Objective-C中没有私有方法,只有静态方法和实例方法。但是可以用private修饰私有

13、变量。模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找它是一种间接访问对象属性的机制。 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。第一个键的性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。键路径使您可以以独立于模型实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性.入口 setImageWithURL:placeholderImage:optio

14、ns: 会先placeholderImage 显示,然后 SDWebImageManager 根据 URL开始处理图片。进入SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo:.先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageMan

15、ager。SDWebImageManagerDelegate 回调webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调notifyDelegate:。如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelega

16、te回调imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。图片下载由NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。connectionDi

17、dFinishLoading: 数据下载完成后交给SDWebImageDecoder 做图片解码处理。图片解码处理在一个NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。UITableView只会创建一屏幕(或一屏幕多一点)的 UITableViewCell,其他都是从中取出来重用的。每当Cell滑出屏幕时,就会放入到一个集合(或数组)中(这里就相当于一个重用池),当要 显示某一位置的Cell时,会先去集合(或数组)中取,如果有,就直接拿来显示;如果没有,才会创建。这样做的好处可想而知,极大的减少了内存的开销。Pr

18、otocol是定义行为而不管谁去怎么实现,这是一种比较洒脱和不负责的情况,就好像在外包项目中的客户一样,他只是他需要什么什么东西,具体实现他不会也不能给出一样。delegate datasource这样的就用protocol实现比较好。Category是对一个功能完备的类的一种补充,就像是一个东西的主要基本功能都完成了,可以用category为这个类添加不同的组件,使得 这个类能够适应不同情况的需求(但是这些不同需求最核心的需求要一致)。继承则是都可以完成上面的工作,但是继承有很大的代价问题,一是通过继承来进行扩展是一种耦合很高的行为,对父类可以说是完全依赖;二是继承由于 对父类依赖,所以开发

19、代价相对大,要求对父类的工作流程相对熟悉;三是继承体系如果太复杂会导致整个系统混乱,难以维护。所以在能够用上面两种方法完成扩 展的时候,就千万不要使用继承。前者不会引起交叉编译的问题。因为在Objective-C中会存在C/C+和Object-C混编的问题,如果用include引入头文件,会导致交叉编译。MVC模式考虑三种对象:模型对象、视图对象和控制器对象。模型对象负责应用程序的数据和定义操作数据的逻辑;视图对象知道如何显示应用程序的模型数据;控制器对象是M与V之间的协调者.Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。1. (Garbage C

20、ollection)自动内存计数:这种方式和java类似,在你的程序的执行过程中。始终有一个高人在背后准确地帮你收拾垃圾,你不用考虑它什么时候开始工作,怎样工作。你只需要明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就彻底的把它忘记掉,反正那个高人会帮我收拾垃圾。遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品所以iPhone不支持这个功能。所以“Garbage Collection”不是本入门指南的范围,对“GarbageCollection”内部机制感兴趣的同学可以参考一些其他的资料,不过说老实话“Garbage Collection”不大适合适

21、初学者研究。解决: 通过alloc initial方式创建的, 创建后引用计数+1, 此后每retain一次引用计数+1, 那么在程序中做相应次数的release就好了.2. (ReferenceCounted)手动内存计数:就是说,从一段内存被申请之后,就存在一个变量用于保存这段内存被使用的次数,我们暂时把它称为计数器,当计数器变为0的时候,那么就是释放这段内存的时候。比如说,当在程序A里面一段内存被成功申请完成之后,那么这个计数器就从0变成1(我们把这个过程叫做alloc),然后程序B也需要使用这个内存,那么计数器就从1变成了2(我们把这个过程叫做retain)。紧接着程序A不再需要这段内

22、存了,那么程序A就把这个计数器减1(我们把这个过程叫做release);程序B也不再需要这段内存的时候,那么也把计数器减1(这个过程还是release)。当系统(也就是Foundation)发现这个计数器变成了0,那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)。顺便提一句,如果没有Foundation,那么维护计数器,释放内存等等工作需要你手工来完成。解决:一般是由类的静态方法创建的, 函数名中不会出现alloc或init字样,如NSString string和NSArray arrayWithObject:, 创建后引用计数+0, 在函数出栈后释放, 即相当于一个

23、栈上的局部变量.当然也可以通过retain延长对象的生存期.3. (NSAutoRealeasePool)内存池:可以通过创建和释放内存池控制内存申请和回收的时机.解决:是由autorelease加入系统内存池, 内存池是可以嵌套的, 每个内存池都需要有一个创建释放对, 就像main函数中写的一样. 使用也很简单,比如NSString allocinitialWithFormat:”Hey you!” autorelease, 即将一个NSString对象加入到最内层的系统内存池, 当我们释放这个内存池时, 其中的对象都会被释放.项目中使用NSOperation的优点是NSOperation是

24、对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。OBC中的代理有2层含义,官方定义为 formal和informal protocol。前者和Java接口一样。informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。其实关于正式协议,类别和非正式协

25、议我很早前学习的时候大致看过,也写在了学习教程里“非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。这么看,总觉得类别这玩意儿有点像协议的可选协议。现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,现在我们看到协议中两个修饰词:“必须实现(requied)”和“可选实现(optional)”。1)obj-c的编译器处理后缀为m的文件时,可以识别

26、obj-c和c的代码,处理mm文件可以识别obj-c,c,c+代码,但cpp文件必须只能用c/c+代码,而且cpp文件include的头文件中,也不能出现obj- c的代码,因为cpp只是cpp2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题3)在cpp中混用obj- c其实就是使用obj-c编写的模块是我们想要的。如果模块以类实现,那么要按照cppclass的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。如果模块以函数实现,那么头文件要按 c的

27、格式声明函数,实现文件中,c+函数内部可以用obj-c,但后缀还是mm或m。总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp.使用HTTPS,加时间戳1分钟内不允许重复发送, 短信验证, 判断手机号段保证号码正确,不是虚拟号吗. 保证邮箱,手机号等设备的标识唯一,并且在输入验证时判断,如果多次验证码错误.可以锁定账号或着手机注册.在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内

28、存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误二者都属于一种数据结构。从逻辑结构来看 1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。 2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素。从内存存储来看 1. (静态)数组从栈

29、中分配空间, 对于程序员方便快速,但是自由度小 2. 链表从堆中分配空间, 自由度大但是申请管理比较麻烦。从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反, 如果需要经常插入和删除元素就需要用链表数据结构了。多继承在这里是用protocol 委托代理 来实现的。不用去考虑繁琐的多继承 ,虚基类的概念.ood的多态特性 在 obj-c 中通过委托来实现.mminterface someClassgitrequired-fno-objc-arcSDWebImage http:/ http:/ 在定义一个count 设置一个timer 每次减少一秒 把count

30、- 再把count的值拼接到label上 当count = 0 的时候在显示验证码输入下载SDK,申请账号、交费、加入客服群,按照SDK进行集成 百度钱包、微信支付、支付宝、银联1 1月月6 6日日之之前前在iOS 4 与 MacOS X 10.6以后,Operation Queue的底层实现都是用GCD来实现的。GCD是底层的C语言构成的API,而NSOperationQueue及相关对象是Objc的对象。在GCD中,在队列中执行的是由block构成的任务,这是一个轻量级的数据结构;而Operation作为一个对象,为我们提供了更多的选择;在NSOperationQueue中,我们可以随时取消已经设定要准备执行的任务(当然,已经开始的任务就无法阻止了),而GCD没法停止已经加入queue的block(其实是有的,但需要许多复杂的代码);NSOperation能够方便地设置依赖关系,我们可以让一个Operation依赖于另一个Operation,这样的话尽管两个Operation处于同一个并行队列中,但前者会直到后者执行完毕后再执行;我们能将KVO应用在NSOperation中,可以监听一个Operation是否完成或取消,这样子能比GCD更加

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论