码迷,mamicode.com
首页 > 移动开发 > 详细

ios面试题

时间:2015-11-08 13:58:57      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:

    • 前提:本文是给面试经验少的同学准备。
      首先,谈一下面试前的准备,分为两个方面;
      —:广泛阅览面试题目,找出重点题目,事先将答案记好。很多人以为自己做了几个项目,平时也有认真学习,不屑于去临时抱佛脚,这是大错特错的,很多你了解的东西到面试时会由于心理压力,而让你表诉不清楚,面试官听的似懂非懂,结果不言而喻,广泛阅读也让你在面试时显得涉猎广,游刃有余。
      二:重中之重,简历的书写,一份好的简历让你在别人开口前,印象分就多了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
      3.json和xml的区别(重点)
      底层展现不同,比如jason用{}表示字典[]数组
    • JSONXML的区别比较
    • 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的理解

    • 6.代理,通知,和block的区别(重点)
      代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。另外一点,代理可以理解为java中的回调监听机制的一种类似。
      代理通知区别,代理通常一对一,需要返回数据,通知一对多,不需要返回数据,block是ios4以后使用,方便,但是格式怪异。
      7.讲一下下拉刷新的实现
      8.用到过什么地图
      9.用过数据库吗,增删改查关键字(重点)
      10.自定义过什么控键吗
      11.viewcontroller的生命周期(重点)
      12.网络安全问题(重点)
      从get post 出发,谈到数据md5加密,协议安全,源代码安全
      13.数据库安全问题
      14.多线程问题
      15.数据结构,堆栈问题
      16.循环引用
      17.线程,进程
      17.最后一个arc非arc,自动释放池(重点)
    • 4
          这些问题并不难,网上也是一搜一大把,大家一一对照着看。
         还是那句话,答案小学生都能背,重要是表述,一定要逻辑清楚,回答问题时应该不仅仅回答问题本身,理应做出适当延展,显露出你的知识面广泛。
    • 5
      最后就到了考验情商时刻了。
      问题一:家住哪儿?
      这可不是与你拉近乎!这考虑的是你工作的稳定心,若是本地则好回答啦!“我就定居住在xxxx”。外地怎么办呢,也简单,就说我一直向往这个城市,大学时选取到了这个城市,以后也想定居在这。

      问题二:你家人知道你来我们这面试吗,他们怎么看,并接一问,定居在这,家人怎么看?
      回答:支持,支持,还是TMD支持!(自己编一下,我就不教坏小孩子了)

      问题三:有女朋友吗?
      回答:有,就在这个城市(稳定性问题,同一问)

      问题四:你对薪酬怎么看?
      回答:我觉得作为一个没有任何工作经验的应届生,首先想的应该是对自我能力的提升,因为对于一个新人来说,获取经验很重要,现阶段的我会把重点放到学习,融入公司上,而不是对薪酬的纠结上。我相信,公司会对我的能力有客观准确的评价,对于我为公司作出的贡献不会视而不见。

      问题五:你对加班怎么看?
      回答:我对加班是这样看的,既然来工作,就必须要有责任心,所以,如果是因为工作需要而加班,当然没问题。但是也应该注意提高工作效率,如果是因为工作拖沓而加班,那是不可取的。

      问题六:你还有什么问题吗?
      这个问题就显水平了,你说没有就太逗比了。
      回答:1 我作为一个刚出身社会的应届生,我现在很看重对自我能力的培养,请问公司对新员工的培养是怎样的?
      2.公司以后在我的工作这块上的发展侧重点。

ios面试题

标签:

原文地址:http://www.cnblogs.com/yw2015/p/4946322.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!