- 前提:本文是给面试经验少的同学准备。
首先,谈一下面试前的准备,分为两个方面;
—:广泛阅览面试题目,找出重点题目,事先将答案记好。很多人以为自己做了几个项目,平时也有认真学习,不屑于去临时抱佛脚,这是大错特错的,很多你了解的东西到面试时会由于心理压力,而让你表诉不清楚,面试官听的似懂非懂,结果不言而喻,广泛阅读也让你在面试时显得涉猎广,游刃有余。
二:重中之重,简历的书写,一份好的简历让你在别人开口前,印象分就多了20分。简历分三个方面:(1)个人信息(2)个人技能(3)项目经验;最后再加上点个人评价(一两句话即可,写一句“适应力强,自学力强”通用。切忌写一大堆。)
这里有两个不错的模版:http://wenku.baidu.com/user/contribution?st=1
- 2
好了,咱们准备工作已经完成。开始模拟面试(题目来自于我亲身经历)。
面试核心思想:引导面试官(过程中体会,结尾总结)。礼仪,着装我就不说了,大家都是成年人。
一般来说,如果你是同几个人一起面试,不要做第一个,原因很简单,你看看“我是歌手”你就明白了。当面试了好几个人后,第一个人的印象会降低,但凡a,b,c能力相差无几,b,c成功率要高过a,另一个重要原因是,后者通常会被问到a没答好的问题,你若是能答好,高下立判。至于答不好,面试官也觉得你们一个水平。
Question 1:什么是面向对象。
切入: 面试官要的不是答案本身,而是你的逻辑表述,理解,及应用。
答:面向对象是区别于面向过程而言的,面向过程可以表述为:程序 = 算法+ 数据结构 ;面向对象可以表述为 程序 = 对象 + 消息。
面向对象是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程。 我们强调“万物皆对象”,我们抽象他们的属性与行为出来,以代码的形式展现。它有三个基本特征
1.封装:
封装就是,隐藏内部具体实现,只提供接口方法去访问。比如我们调用NSString类的,截取,拼接方法时,我们并不需要具体的算法,而只需调用相应方法。
2. 继承:
它是面向对象的程序中两个类之间的一种关系,即一个类可以从另一个类(即它的父类)继承状态和行为。继承父类的类称为子类。
继承的优越性:通过使用继承,程序员可以在不同的子类中多次重新使用父类中的代码,使程序结构清晰,易于维护和修改,而子类又可以提供一些特殊的行为,这些特殊的行为在父类中是没有的 。
3.多态:
是指一个程序中同名的方法共存的情况,调用者只需使用同一个方法名,系统会根据不同情况,调用相应的不同方法,从而实现不同的功能。多态性又被称为“一个名字,多个方法”。
以上的操作就是为了实现代码复用,实现代码的可移植性,灵活性,及低耦合,高内聚。
一个问题居然写了这么多。。。。。。
- 3
Question 2:简单介绍下你做的项目(这里就是开始引导面试官了,如果他不问这个问题,你就自己提出来,你要知道面试官其实也紧张,他不知道你会些什么,它可能懂得多,却也有无从下手的感觉,你递个枕头,他肯定会接的。)
答:(选取你自己会的答,比如)我用到了自定义cell显示数据,使用三方框架AFNetworking,ASIHttpRequest,访问网络,拿到Jason,XML格式数据,然后进行一些数据的解析,本地存储,还有用xmpp实现的即时聊天,在本地用代理,通知,block进行类之间的通信,并植入了地图,实现了上拉加载,下拉刷新功能。。。。。
看到没有,面试问题就出来了
1.讲一下tableViewCell的复用问题(重点)
这是指它的重用机制,先明白为什么要重用,无他:效率,内存。
查看UITableView头文件,会找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells两个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells。
TableView显示之初,reusableTableCells为空,那么tableView dequeueReusableCellWithIdentifier:CellIdentifier返回nil。开始的cell都是通过[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]来创建,而且cellForRowAtIndexPath只是调用最大显示cell数的次数。
比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是:
1. 用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加入到visiableCells数组,reusableTableCells为空。
2. 向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。
3. 接着向下拖动tableView,因为reusableTableCells中已经有值,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用的时候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。cell1加入到visiableCells,cell1移出reusableTableCells;cell2移出visiableCells,cell2加入到reusableTableCells。之后再需要显示的Cell就可以正常重用了。
2.讲一下如何根据内容自定义cell行高
以前用的三方RTLabel(非arc,int,NSInteger等问题,方法过老,版本无跟新,以弃用)
// iOS6中的方法,在iOS7中弃用了
/* CGSize textSize = [textArray sizeWithFont:[UIFont systemFontOfSize:16.0] constrainedToSize:CGSizeMake(280, 100000000) lineBreakMode:NSLineBreakByWordWrapping];*/
// 定义一个字典,里面还可以放入其他属性,不仅仅是字体大小
NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:15.0]};
//iOS7中提供的计算文本尺寸的方法 CGSize textSize1 = [textArray boundingRectWithSize:tableView.bounds.size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine attributes:attribute context:nil].size;
NSLog(@"%f",textSize1.height);
3.讲一下AFNetworking,ASIHttpRequest -
ASI和AFN以及底层框架的关系
对比ASI AFN 更新状态 2012年10月份,已经停止更新 持续更新中,目前已更新至2.0版 介绍 ASI的直接操作对象ASIHTTPRequest,是一个实现了了NSCopying协议的NSOperation子类。在initialize和initWithURL:方法中初始化相关属性并配置一系列请求相关参数默认值。此外,ASIHTTPRequest还提供了一系列的实例方法用来配置请求对象。AFN的直接操作对象AFHTTPClient,是一个实现了NSCoding和NSCopying协议的NSObject子类。AFHTTPClient是一个封装了一系列操作方法的“工具类”,处理请求的操作类是一系列单独的,基于NSOperation封装的,AFURLConnectionOperation的子类。 线程处理模式 每一个请求都由构造方法初始化一个(共享)实例,通过这个实例配置参数并发起请求。ASI最初使用delegate模式回调,在iOS SDK支持Block之后也提供了注册Block的实例方法。ASI采取的是CFHTTP请求完成,直接回调ASIHTTPRequest的实例方法,通过储存的实例对象记录的信息完成Delegate模式或Block模式的回调。在异步请求的处理上,ASIHTTPRequest对象初始化结束后,在startAsynchronous方法中把对象加入共享操作队列。此后,包括创建CFHTTPMessageRef,也就是处理网络请求的主要对象(事实上是一个指向__CFHTTPMessage结构的指针),在内的所有操作都在ASIHTTPRequest对象所属的子线程中完成。AFN的示例代码中通过一个静态方法,使用dispatch_once()的方式创建AFHTTPClient的共享实例,这也是官方建议的使用方法。在创建AFHTTPClient的初始化方法中,创建了OperationQueue并设置一系列参数默认值。在getPath:parameters:success:failure方法中创建NSURLRequest,以NSURLRequest对象实例作为参数,创建一个NSOperation,并加入在初始化发方中创建的NSOperationQueue。以上操作都是在主线程中完成的。在NSOperation的start方法中,以此前创建的NSURLRequest对象为参数创建NSURLConnection并开启连结。数据处理模式 ASI在这方面显得更原始,没有针对任何数据类型做特别封装,只是预留了各种接口和工具供开发者自行扩展。 AFN针对JSON、XML、PList和Image四种数据结构封装了各自处理器,开发者可以把处理器注册到操作队列中,直接在回调方法中获得格式化以后的数据。 同步请求 ASI则是直接通过调用一个startSynchronous方法。AFN默认没有封装同步请求,如果开发者需要使用同步请求,则需要重写getPath:parameters:success:failure方法,对AFHTTPRequestOperation进行同步处理 异步回调的处理 【使用AFNetworking进行网络异步请求时,block:(void(^)代码块实际返回到UI主线程中。即使在子线程中使用AFNetWorking进行网络的异步请求,block:(void(^)代码块仍然返回到UI主线程中(AF框架,它里面已经create了异步线程 )。因此无论当前处在主线程还是子线程,异步返回均返回到UI主线程中。】 为一系列相关的请求定义一个HTTPClient,共用一个BaseURL。每次请求把URL中除BaseURL的Path部分做为参数传给HTTPClient的静态方法,并注册一个Block用于回调。AFN则直接使用了NSOperation的completionBlock属性。基于的底层开发框架CFNetwork框架使用CFnetwork而不是Cocoa框架NSURL有几点好处。CFNetwork更加专注于网络协议,而NSURL更加专注于数据访问,比如通过HTTP或者FTP传输数据。尽管NSURL的确也提供了一些可配置功能,可是CFNetwork提供的要多的多。另外NSURL还需要你使用Objective_c。如果做不到这点的话,还是应该使用CFNetworkNSURL【使用iOS5.0 SDK NSURLConnection:1、进行网络同步请求(sendSynchronousRequest)时,调用该请求接口的操作在哪个线程,同步返回的网络结果就处于哪个线程,因此通常进行网络同步请求时,为了避免阻塞UI主线程,需要在子线程中进行网络请求;2、进行网络异步请求(sendAsynchronousRequest)时,block:(void(^)代码块实际返回到子线程中。因此,此时如需要向UI线程发送通知,则需要跳转到主线程中发送通知dispatch_async(dispatch_get_main_queue(), ^{});】底层开发矿建介绍 CFNetwork是基于Core Foundation中CFStream的一个底层高性能网络框架,它由提供基础服务的CFSocketStream,支持HTTP协议的CFHTTP,基于CFHTTP用于身份认证的CFHTTPAuthentication和支持FTP协议的CFFTP组成。Core Foundation框架中的CFSocket就是基于BSD Socket开发的。它几乎涵盖了BSD Socket的全部功能,更重要的是把Socket整合到事件的处理循环中。Core Founda-tion中较高层的CFStream是基于CFSocket开发的读写流支持。如图所示,ASI是基于CFHTTP开发的一个组件;而AFN的基础——NSURL,也是基于CFNetwork开发的,也就是说ASI相比AFN更加底层。 性能对比 AFN请求优于ASI 总结 ASI更适合已经发展了一段时间的应用,或者开发资源相对丰富的团队,因为往往这些团队(或他们的应用)已经积累了一定的经验,无论是产品上还是技术上的。需求复杂度就是在这种时候高起来,而且底层订制的需求也越来越多,此时AFN就很难满足需求,需要牺牲一定的易用性,使用ASI作为网络底层控件。 AFN适合逻辑简单的应用,或者更适合开发资源尚不丰富的团队,因为AFN的易用性要比ASI好很多,而这样的应用(或团队)对底层网络控件的定制化要求也非常低。 以上分析与对比是根据本人查资料以及测试所得,若有不正确的地方还请大家指出,谢谢!
另附:iOS开发:AFNetworking、MKNetworkKit和ASIHTTPRequest比较【下图为查找的资料,尚未验证】
3.json和xml的区别(重点)
底层展现不同,比如jason用{}表示字典[]数组 - JSON与XML的区别比较
- 1.定义介绍
- (1).XML定义
- 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
- XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
- (2).JSON定义
- JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的行为。这些特性使JSON成为理想的数据交换语言。
- JSON基于JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。
- 2.XML和JSON优缺点
- (1).XML的优缺点
- <1>.XML的优点
- A.格式统一,符合标准;
- B.容易与其他系统进行远程交互,数据共享比较方便。
- <2>.XML的缺点
- A.XML文件庞大,文件格式复杂,传输占带宽;
- B.服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;
- C.客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;
- D.服务器端和客户端解析XML花费较多的资源和时间。
- (2).JSON的优缺点
- <1>.JSON的优点:
- A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
- B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
- C.支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;
- D.在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;
- E.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
- <2>.JSON的缺点
- A.没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;
- B.JSON格式目前在Web Service中推广还属于初级阶段。
- 3.XML和JSON的优缺点对比
- (1).可读性方面。
- JSON和XML的数据可读性基本相同,JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,XML可读性较好些。
- (2).可扩展性方面。
- XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
- (3).编码难度方面。
- XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
- (4).解码难度方面。
- XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
- (5).流行度方面。
- XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。
- (6).解析手段方面。
- JSON和XML同样拥有丰富的解析手段。
- (7).数据体积方面。
- JSON相对于XML来讲,数据的体积小,传递的速度更快些。
- (8).数据交互方面。
- JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。
- (9).数据描述方面。
- JSON对数据的描述性比XML较差。
- (10).传输速度方面。
- JSON的速度要远远快于XML。
- 4.XML与JSON数据格式比较
- (1).关于轻量级和重量级
- 轻量级和重量级是相对来说的,那么XML相对于JSON的重量级体现在哪呢?应该体现在解析上,XML目前设计了两种解析方式:DOM和 SAX。
- <1>.DOM
- DOM是把一个数据交换格式XML看成一个DOM对象,需要把XML文件整个读入内存,这一点上JSON和XML的原理是一样的,但是XML要考虑父节点和子节点,这一点上JSON的解析难度要小很多,因为JSON构建于两种结构:key/value,键值对的集合;值的有序集合,可理解为数组;
- <2>.SAX
- SAX不需要整个读入文档就可以对解析出的内容进行处理,是一种逐步解析的方法。程序也可以随时终止解析。这样,一个大的文档就可以逐步的、一点一点的展现出来,所以SAX适合于大规模的解析。这一点,JSON目前是做不到得。
- 所以,JSON和XML的轻/重量级的区别在于:
- JSON只提供整体解析方案,而这种方法只在解析较少的数据时才能起到良好的效果;
- XML提供了对大规模数据的逐步解析方案,这种方案很适合于对大量数据的处理。
- (2).关于数据格式编码及解析难度
- <1>.在编码方面。
- 虽然XML和JSON都有各自的编码工具,但是JSON的编码要比XML简单,即使不借助工具,也可以写出JSON代码,但要写出好的XML代码就有点困难;与XML一样,JSON也是基于文本的,且它们都使用Unicode编码,且其与数据交换格式XML一样具有可读性。
- 主观上来看,JSON更为清晰且冗余更少些。JSON网站提供了对JSON语法的严格描述,只是描述较简短。从总体来看,XML比较适合于标记文档,而JSON却更适于进行数据交换处理。
- <2>.在解析方面。
- 在普通的web应用领域,开发者经常为XML的解析伤脑筋,无论是服务器端生成或处理XML,还是客户端用 JavaScript 解析XML,都常常导致复杂的代码,极低的开发效率。
- 实际上,对于大多数Web应用来说,他们根本不需要复杂的XML来传输数据,XML宣称的扩展性在此就很少具有优势,许多Ajax应用甚至直接返回HTML片段来构建动态Web页面。和返回XML并解析它相比,返回HTML片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。同XML或 HTML片段相比,数据交换格式JSON 提供了更好的简单性和灵活性。在Web Serivice应用中,至少就目前来说XML仍有不可动摇的地位。
4.本地数据如何存储,用到些什么方法(重点)
coredata,NSUserDefaultCenter,数据库,写入文件- 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。例如对Possession对象归档保存。
- 定义Possession:
- @interfacePossession:NSObject{ //遵守NSCoding协议
- NSString *name; //待归档类型
- }
- @implementation Possession
- -(void)encodeWithCoder:(NSCoder *)aCoder{
- [aCoderencodeObject:nameforKey:@"name"]; }
- -(void)initWithCoder:(NSCoder *)aDecoder{
- name=[aDeCoder decodeObjectforKey:@"name"] retain];
- }
- 归档操作:如果对Possession对象allPossession归档保存,只需要NSCoder子类NSKeyedArchiver的方法archiveRootObject:toFile: 即可。
- NSString *path =[selfpossessionArchivePath];
- [NSKeyedArchiver archiveRootObject:allPossessions toFile: path ]
- 解压操作:同样调用NSCoder子类NSKeyedArchiver的方法unarchiveRootObject:toFile:即可allPossessions =[NSKeyedUnarchiverunarchiveObjectWithFile:path] retain];
- 缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。
- 2.NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、 NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储。具体实现为:
- 保存数据:
- NSUserDefaults *defaults=[NSUserDefaultsstandardUserDefaults];
- NSString *name =@”default string“;
- [defaults setObject:firstName forKey:@"name"];
- //获得UIImage实例
- UIImage *image=[UIImage alloc]initWithContentsOfFile:@"photo.jpg"];
- NSData *imageData = UIImageJPEGRepresentation(image, 100);//UIImage对象转换成NSData [defaults
- synchronize];//用synchronize方法把数据持久化到standardUserDefaults数据库
- 读取数据:
- NSUserDefaults *defaults=[NSUserDefaultsstandardUserDefaults];
- NSString *name = [defaults objectForKey:@"name"];//根据键值取出name
- NSData *imageData = [defaults dataForKey:@"image"];
- UIImage *Image = [UIImage imageWithData:imageData];//NSData转换为UIImage
- 3. Write写入方式:永久保存在磁盘中。具体方法为:
- 第一步:获得文件即将保存的路径:
- NSArray*documentPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);//使用C函数NSSearchPathForDirectoriesInDomains来获得沙盒中目录的全路径。该函数有三个参数,目录类型、he domain mask、布尔值。其中布尔值表示是否需要通过?~扩展路径。而且第一个参数是不变的,即为NSSearchPathDirectory。在IOS中后两个参数也是不变的,即为:NSUserDomainMask和YES。
- NSString *ourDocumentPath =[documentPaths objectAtIndex:0];
- 还有一种方法是使用NSHomeDirectory函数获得sandbox的路径。具体的用法为:
- NSString *sandboxPath = NSHomeDirectory();
- // Once you have the fullsandbox path, you can create a path from it,但是不能在sandbox的本文件层上写文件也不能创建目录,而应该是此基础上创建一个新的可写的目录,例如Documents,Library或者temp。 NSString *documentPath = [sandboxPath
- stringByAppendingPathComponent:@"Documents"];//将Documents添加到sandbox路径上,具体原因前面分析了!
- 这两者的区别就是:使用NSSearchPathForDirectoriesInDomains比在NSHomeDirectory后面添加Document更加安全。因为该文件目录可能在未来发送的系统上发生改变。
- 第二步:生成在该路径下的文件:
- NSString *FileName=[documentDirectorystringByAppendingPathComponent:fileName];//fileName就是保存文件的文件名
- 第三步:往文件中写入数据:
- [datawriteToFile:FileNameatomically:YES];//将NSData类型对象data写入文件,文件名为FileName
- 最后:从文件中读出数据:
- NSDatadata=[NSDatadataWithContentsOfFile:FileName options:0 error:NULL];//从FileName中读取出数据
5.xmpp的理解- XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。
6.代理,通知,和block的区别(重点)- 通知:“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通知;
delegate:
1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;
2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
block:
1:写法更简练,不需要写protocol、函数等等
2,block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
3,block需要注意防止循环引用:
ARC下这样防止:
__weak typeof(self) weakSelf = self;
[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
[weakSelf doSomething];
}];
非ARC
__block typeof(self) weakSelf = self;
[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
[weakSelf doSomething];
}];
代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。另外一点,代理可以理解为java中的回调监听机制的一种类似。
代理通知区别,代理通常一对一,需要返回数据,通知一对多,不需要返回数据,block是ios4以后使用,方便,但是格式怪异。
7.讲一下下拉刷新的实现
8.用到过什么地图
9.用过数据库吗,增删改查关键字(重点)
10.自定义过什么控键吗
11.viewcontroller的生命周期(重点)-
1、alloc 创建对象,分配空间
-
2、init (initWithNibName )初始化对象,初始化数据
-
3、loadView 从nib载入视图,通常这一步不需要去干涉。除非你没有使用xib文件创建
-
4、viewDidLoad载入完成,可以进行自定义数据以及动态创建其他控件
-
5、viewWillAppear视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
-
6、viewDidAppear 视图已在屏幕上渲染完成
当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
-
1、viewWillDisappear视图将被从屏幕上移除之前执行
-
2、viewDidDisappear视图已经被从屏幕上移除,用户看不到这个视图了
3.viewUnLoad
-
4、dealloc视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行
12.网络安全问题(重点) - 从get post 出发,谈到数据md5加密,协议安全,源代码安全
13.数据库安全问题-
iOS开发数据库篇—SQLite简单介绍
一、离线缓存
在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等。说明:离线缓存一般都是把数据保存到项目的沙盒中。有以下几种方式(1)归档:NSCodeing、NSKeyedArchiver(2)偏好设置:NSUserDefaults(3)Plist存储:writeToFile提示:上述三种方法都有一个致命的缺点,那就是都无法存储大批量的数据,有性能的问题。举例:使用归档两个问题:(1)数据的存取都必须是完整的,要求写入的时候要一次性写入,读取的时候要一次性全部读取,这涉及到应用的性能问题。(2)如果有1000条数据,此时要把第1001条数据存入,那么需要把所有的数据取出来,把这条数据加上去之后,再存入。说明:以上的三种技术不能处理大批量数据的存储,大批量数据通常使用数据库来进行存储。二、SQLite简单介绍1.ios中数据的存储方式
(1)Plist(NSArrayNSDictionary)
(2)Preference(偏好设置NSUserDefaults)
(3)NSCoding(NSKeyedArchiverNSkeyedUnarchiver)
(4)SQLite3
(5)Core Data
说明:
3是版本号,是SQLite的第三个版本。core Data是对SQLite的封装,因为iOS中使用的SQLite是纯C语言的。2.SQLite(1)什么是SQLite?
答:SQLite是一款轻型的嵌入式数据库,安卓和ios开发使用的都是SQLite数据库
(2)特点(优点)
答:1)它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了
2)它的处理速度比Mysql、PostgreSQL这两款著名的数据库都还快
(3)什么是数据库
答:数据库(Database)是按照数据结构来组织、存储和管理数据的仓库
(4)数据库的分类
答:可以分为2大种类
关系型数据库(主流)和对象型数据库(直接把内存中的对象塞入到数据库,对比关系型数据库而言性能不能很好,效率不高)
(5)常用关系型数据库有哪些?
答:PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase
嵌入式移动客户端:SQLite
(6)数据库是如何存储数据的?
答:数据库的存储结构和excel很像,以表(table)为单位 。表由多个字段(列、属性、column)组成,表里面的每一行数据称为记录
(7)数据库存储数据的步骤?
1)新建一张表(table)
2)添加多个字段(column,列,属性)
3)添加多行记录(row,record,每行存放多个字段对应的值)
三、Navicat
Navicat是一款著名的数据库管理软件,支持大部分主流数据库(包括SQLite)
14.多线程问题 -
*进程是指在系统中正在运行的一个应用程序
*1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)
线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行
比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行
*iOS有三种多线程编程的技术,分别是:NSThread 、Cocoa NSOperation 、GCD。 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的。
NSThread:
优点:NSThread 比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。
GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。
一个任务可以是一个函数(function)或者是一个block。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。
GCD会自动根据任务在多核处理器上分配资源,优化程序
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行。
15.数据结构,堆栈问题
16.循环引用
17.线程,进程
17.最后一个arc非arc,自动释放池(重点)
- 4
这些问题并不难,网上也是一搜一大把,大家一一对照着看。
还是那句话,答案小学生都能背,重要是表述,一定要逻辑清楚,回答问题时应该不仅仅回答问题本身,理应做出适当延展,显露出你的知识面广泛。
- 5
最后就到了考验情商时刻了。
问题一:家住哪儿?
这可不是与你拉近乎!这考虑的是你工作的稳定心,若是本地则好回答啦!“我就定居住在xxxx”。外地怎么办呢,也简单,就说我一直向往这个城市,大学时选取到了这个城市,以后也想定居在这。
问题二:你家人知道你来我们这面试吗,他们怎么看,并接一问,定居在这,家人怎么看?
回答:支持,支持,还是TMD支持!(自己编一下,我就不教坏小孩子了)
问题三:有女朋友吗?
回答:有,就在这个城市(稳定性问题,同一问)
问题四:你对薪酬怎么看?
回答:我觉得作为一个没有任何工作经验的应届生,首先想的应该是对自我能力的提升,因为对于一个新人来说,获取经验很重要,现阶段的我会把重点放到学习,融入公司上,而不是对薪酬的纠结上。我相信,公司会对我的能力有客观准确的评价,对于我为公司作出的贡献不会视而不见。
问题五:你对加班怎么看?
回答:我对加班是这样看的,既然来工作,就必须要有责任心,所以,如果是因为工作需要而加班,当然没问题。但是也应该注意提高工作效率,如果是因为工作拖沓而加班,那是不可取的。
问题六:你还有什么问题吗?
这个问题就显水平了,你说没有就太逗比了。
回答:1 我作为一个刚出身社会的应届生,我现在很看重对自我能力的培养,请问公司对新员工的培养是怎样的?
2.公司以后在我的工作这块上的发展侧重点。