IOS面试题

安卓的面试题

https://xie.infoq.cn/article/1a8bb66d10cdcd9c896828be1

1. IOS常用的设计模式

单例模式,DeafutCenter,Deafultqueue等

MVC模式,View,model,ViewController。

观察者模式,通知,KVO,(Key-Value Observing,俗称“键值监听)

工厂模式,代理模式,delegate

2. 项目中的数据存储都有哪些,iOS中有哪些数据存储方法,什么时候用?

  • 1、文件
  • 2、NSUserDefaults
  • 3、数据库4、KeyChain5、iCloud

文件(主要是把数据存储在磁盘中。通过写和读文件操作)

  • 1、沙盒
  • 2、Plist
  • 3、NSKeyedArchiver归档 / NSKeyedUnarchiver解档

NSUserDefaults 数据库(主要是存储应用程序中的一些轻量级数据如应用程序的设置和属性和用户信息等。)

  • 1、SQLite3
  • 2、FMDB
  • 3、Core Data
备注:Core Data,sqlite涉及到数据库。sqlite需要通过sqlite语句操作数据库,而core data是Apple提供的一个基于sqlite更抽象成对象的一种对数据库操作方式。file,。

 

3、MVVM如何实现绑定?

MVVM 的实现可以采用KVO进行数据绑定,也可以采用RAC。其实还可以采用block、代理(protocol)实现。 MVVM比起MVC最大的好处就是可以实现自动绑定,将数据绑定在UI组件上,当UI中的值发生变化时,那么它对应的模型中也跟随着发生变化,这就是双向绑定机制,

原因在于它在视图层和数据模型层之间实现了一个绑定器,绑定器可以管理两个值,它一直监听组件UI的值,只要发生变化,它将会把值传输过去改变model中的值。绑定器比较灵活,还可以实现单向绑定。 实际开发中的做法:

  • 1、让Controller拥有View和ViewModel属性,VM拥有Model属性;Controller或者View来接收ViewModel发送的Model改变的通知
  • 2、用户的操作点击或者Controller的视图生命周期里面让ViewModel去执行请求,请求完成后ViewModel将返回数据模型化并保存,从而更新了Model;Controller和View是属于V部分,即实现V改变M(V绑定M)。如果不需要请求,这直接修改Model就是了。
  • 3、第2步中的Model的改变,VM是知道的(因为持有关系),只需要Model改变后发一个通知;Controller或View接收到通知后(一般是Controller先接收再赋值给View),根据这个新Model去改变视图就完成了M改变V(M绑定V) 。使用RAC(RactiveCocoa)框架实现绑定可以简单到一句话概括:ViewModel中创建好请求的信号RACSignal, Controller中订阅这个信号,在ViewModel完成请求后订阅者调用sendNext:方法,Controller里面订阅时写的block就收到回调了。

4. KVC and KVO

KVC(key-value-coding)键值编码,是一种间接操作对象属性的一种机制,可以给属性设置值。通过setValue:forKey:和valueForKey,实现对属性的存取和访问。

KVO(key-value-observing)键值观察,是一种使用观察者模式来观察属性的变化以便通知注册的观察者。通过注册observing对象addObserver:forKeyPath:options:context:和观察者类必须重写方法 observeValueForKeyPath:ofObject:change:context:。常应用MVC模型中,数据库(dataModal)发生变化时,引起view改变。

 5、block 和 通知的区别

通知:  一对多 Block:

  • 通常拿来OC中的block和swift中的闭包来比较.
  • block注重的是过程
  • block会开辟内存,消耗比较大,delegate则不会
  • block防止循环引用,要用弱引用

Delegate: 代理注重的是过程,是一对一的,对于一个协议就只能用一个代理,更适用于多个回调方法(3个以上),block则适用于1,2个回调时

19. block编程

Block 是一种具有匿名功能的内嵌函数块。Block 一般是用来表示、简化一小段的程式码,它特别适合用来建立一些同步执行的程式片段、封装一些小型的工作或是用来做为某一个工作完成时的回传呼叫(callback) 。格式如下:^(传入参数列) {行为主体};

5. 内存管理和优化

原则:

1. 1 谁创建,谁释放(类似于“谁污染,谁治理”)。如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。

例如,你在一个函数中alloc生成了一个对象,且这个对象只在这个函数中被使用,那么你必须在这个函数中调用release或autorelease。如果你在一个class的某个方法中alloc一个成员对象,且没有调用autorelease,那么你需要在这个类的dealloc方法中调用release;如果调用了autorelease,那么在dealloc方法中什么都不需要做。

1. 2 除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。

1. 3 谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。有时候你的代码中明明没有retain,可是系统会在默认实现中加入retain。

#### 优化:

在收到内存didReceiveMemoryWarning的警告时,释放掉一些不再需要的资源,注意编码规范,如一些变量不使用需要及时的释放。避免是占用太多的内存空间,有时需要用空间去换取时间,尽量使用一些高效的算法和数据结构节约内存空间。最后使用一些内存检测工具和代码的静态分析查找内存泄漏和分配(instrument,leaks,allocations)。

6. tableview的优化

优化:

1. 1 正确的复用cell。

1. 2 减少在返回每个cell里面的处理逻辑和处理时间。尽量将数据进行缓存和复用。

1. 3 尽量减少处理加载和计算的时间,不阻塞UI线程。

1. 4 尽量使用绘制每个cell。

1. 5 设置每个cell的opaque属性。

1. 6 尽量返回每行固定的height。

1. 7 在每个cell减少图形效果。

1. 8 分段加载数据。

7. opengl,quatarz 2d

上面2种方式是进行图形绘制会使用到的技术。

quatarz 2d 是Apple提供的基于Core graphic的绘制基本图形工具库。操作简单方便,能够满足大部分需要。只是适用于2D图形的绘制。

opengl,是一个跨平台的图形开发库。适用于2D和3D图形的绘制。功能强大但是复杂。

8. animation

IOS提供丰富的Core Animation动画满足用户的需要,主要实现方式如下3种

1 commitAnimations方式使用UIView动画

2、CATransition

3、UIView animateWithDuration

9. 定制化view

需要自己自己继承自cocoa touch提供的丰富的类。如(UIView,UiScrollView,UITableView等等)。需要重载实现drawRect,touch事件,init,initFrame等方法。

10、进程间通信方式?线程间通信?

  • 1、URL scheme  这个是iOS APP通信最常用到的通信方式,APP1通过openURL的方法跳转到APP2,并且在URL中带上想要的参数,有点类似HTTP的get请求那样进行参数传递。这种方式是使用最多的最常见的,使用方法也很简单只需要源APP1在info.plist中配置LSApplicationQueriesSchemes,指定目标App2的scheme;然后再目标App2的info.plist 中配置好URLtypes,表示该App接受何种URL scheme的唤起。
  • 2、Keychain  iOS 系统的keychain是一个安全的存储容器,它本质上就是一个sqlite数据库,它的位置存储在/private/var/Keychains/keychain-2.db,不过它索八坪村的所有数据都是经过加密的,可以用来为不同的APP保存敏感信息,比如用户名,密码等。iOS系统自己也用keychain来保存VPN凭证和WiFi密码。它是独立于每个APP的沙盒之外的,所以即使APP被删除之后,keychain里面的信息依然存在

12. NSThread,NSOperation,GCD

NSThread,NSOperation,GCD是IOS中使用多线程的三种方式之一。他们各有优缺点。抽象层次是从低到高的,抽象度越高的使用越简单。

NSThread,缺点:需要自己维护线程的生命周期和线程的同步和互斥,但是这些都需要耗费系统的资源。优点:比其它两个更轻。

NSOperation,优点:不需要自己管理线程的生命周期和线程的同步和互斥等。只是需要关注自己的业务逻辑处理,需要和NSOperationQueue一起使用。

GCD,是Apple开发的一个多核编程解决方法,优点:比前面两者更高效更强大。

 13、UIPasteBoard

是剪切板功能,因为iOS 的原生空间UItextView,UItextfield,UIwebView ,我们在使用时如果长按,就回出现复制、剪切、选中、全选、粘贴等功能,这个就是利用系统剪切板功能来实现的。

14、UIDocumentInteractionController

 uidocumentinteractioncontroller 主要是用来实现同设备上APP之间的贡献文档,以及文档预览、打印、发邮件和复制等功能。

 15、Local socket

 原理:一个APP1在本地的端口port1234 进行TCP的bind 和 listen,另外一个APP2在同一个端口port1234发起TCP的connect连接,这样就可以简历正常的TCP连接,进行TCP通信了,然后想传什么数据就可以传什么数据了

16、如何检测应用卡顿问题?

NSRunLoop调用方法主要就是在kCFRunLoopBeforeSources和kCFRunLoopBeforeWaiting之间,还有kCFRunLoopAfterWaiting之后,也就是如果我们发现这两个时间内耗时太长,那么就可以判定出此时主线程卡顿。

17. 机型和尺寸的适配

Iphone 的主要尺寸是3.5和4英寸。分辨率为:320*480,480*960(retina)。

IPad 主要尺寸是7.9和9.7英寸。分辨率为:1024*768,2048*1536(retina)。

18. 添加手势的方式(gesture和touches事件)

1. 自己重载实现touchMoved,touchBegin,touchEnd,touchCanceled事件。

2. 通过UIGestureRecongnizer添加AddGestureRecognier事件。该方式方便添加一些诸如点击,双击,拖动等基本的手势事件。


20. 常用的开源框架

网络框架:ASIHttpRequest,AFNetworking,coocaHttpServer等。

进度条:SVprogressHUD,MBprogressHUD,

工具类:SSToolKit等。

分享类:ShareKit等

日志框架:log4j,cocoa lumberJack 等

21. 数据解析(json和XML)

json数据的解析通常借助一些开源的框架如:SBJson,TouchJson,jsonKit,Apple 提供的原生的JSon解析 NSJSON Serialization等。去json数据转化为IOS中常用的字典等。

XML数据的解析。xml分为SAX和DOM两种解析方式。

DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。

SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。

一般在iOS平台下,比较常用的XML解析类库有如下几种:

NSXMLParser,,这是一个SAX方式解析XML的类库,默认包含在iOS SDK中,使用也比较简单。

libxml2,是一套默认包含在iOS SDK中的开源类库,它是基于C语言的API,所以使用起来可能不如NSXML方便。这套类库同时支持DOM和SAX解析,libxml2的SAX解析方式还是非常酷的,因为它可以边读取边解析,尤其是在从网上下载一个很大的XML文件,就可以一边下载一边对已经下载好的内容进行解析,极大的提高解析效率。

TBXML,这是一套轻量级的DOM方式的XML解析类库,有很好的性能和低内存占用,不过它不对XML格式进行校验,不支持XPath,并且只支持解析,不支持对XML进行修改。

TouchXML,这也是一套DOM方式的XML解析类库,支持XPath,不支持XML的修改。

KissXML,这是一套基于TouchXML的XML解析类库,和TouchXML相比,支持了XML的修改。

TinyXML,这是一套小巧的基于C语言的DOM方式进行XML解析的类库,支持对XML的读取和修改,不直接支持XPath,需要借助另一个相关的类库TinyXPath才可以支持XPath。

GDataXML,这是一套Google开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询。

22. webservice

Web service是一个平台独立的,松耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。技术支持包含如下:

1. 1 xml 和xsd

1. 2 Soap

1. 3 wsdl

1. 4 udd

1. 5 调用RPC和消息传递

23. 开发App的步骤,开发者账号,发布app到appstore

证书分两种:开发者证书、发布者证书。前者开发时使用,后者发布使用

(1) 模拟器调试无需代码签名;真机调试需开发者证书代码签名;发布时需发布证书签名

(2) 代码签名需要:证书+私钥,

(3) 真机调试时要求在设备上安装描述文件(provision profile),该文件包含信息:调试者证书,

授权调试设备清单,应用ID。一个应用对应一个描述文件

24. CAlayer介绍

一个UIView包含CALayer树,CALayer是一个数据模型。包含了一些用来显示的对象,在UIView的子类中都可以找到层这个组件,层是位于固定的画布上的一个子片,可以被覆盖。层是彼此堆叠在一起的最终产生一个界面。除此之层可以包含多个层,通过层可以操作位于此层上面的其他内容,例如旋转,动画,翻页等。

35. ios 怎么实现多继承

IOS通过实现protocol委托代理,实现多个接口来实现多继承。

26. app性能测试方式

通过Xcode提供的工具如Instrument,测试CPU,Mermory性能。也可以适用一些开源的自动化测试工具:如Frank,KIF等。

37. NSArray可以放基本数据类型不(int,float,nil)怎么放进一个结构体

NSArray 只能存放objective-c对象数据模型,这些基本数据类型需要先转化为NSNumber对象再存放进数组中。

28. 常见的语言编码(utf-8,unicode,gb2312,gbk)

常见的语言编码有:

GB2312:简体中文编码,一个汉字占用2字节,在大陆是主要编码方式。

BIG5:繁体中文编码。主要在台湾地区采用。

GBK:支持简体及繁体中文,但对他国非拉丁字母语言还是有问题。

UTF-8:Unicode编码的一种。Unicode用一些基本的保留字符制定了三套编码方式,它们分别UTF-8,UTF-16和UTF-32。在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分。UTF-8俗称“万国码”,可以同屏显示多语种,一个汉字占用3字节。为了做到国际化,网页应尽可能采用UTF-8编码。

当然,处理中文时http头也要改成UTF-8编码的-----加上<meta http-equiv="Content-Type" content="text/html; charset=utf-8">。

 

语言 字符集 正式名称

英语、西欧语 ASCII,ISO-8859-1 MBCS多字节

简体中文 GB2312 MBCS多字节

繁体中文 BIG5 MBCS多字节

简繁中文 GBK MBCS多字节

中文、日文及朝鲜语 GB18030 MBCS多字节

各国语言 UNICODE,UCS DBCS宽字节

29. 常见的加解密方式(rsa,aes,md5)

常见的加解密方式有:

RSA:基于公钥和私钥的非对程加密算法。适用范围广。

AES:是一种对程加密的流行方式。加密涉及矩阵运算。

MD5:将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,

30. objective-c语言的优缺点

objc优点:

1) Cateogies

2) Posing

3) 动态识别

4) 指标计算

5) 弹性讯息传递

6) 不是一个过度复杂的 C 衍生语言

7) Objective-C 与 C++ 可混合编程

缺点:

1) 不支援命名空間

2) 不支持运算符重载

3) 不支持多重继承

4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣

31. ios应用的调试技巧

1. 如遇到crash,分析崩溃日志(symbolicatedrash工具的适用)保留崩溃版本的.dSYM文件

2. 在 XCode 中进入断点管理窗口;然后点击右下方的 +增加新的 Exception Breakpoint。

3. 如遇到EXC_BAD_ACCESS,打开Scheme选项选择EditScheme。然后按图勾上Enable Zombie Objects和Malloc Stack那两项。

4. 有效的日志管理。NSLog和加入一些开源的日志管理框架。

5. 程序断点debug模式。

32. 应用程序性能的调优(转 25条提高iOS App性能的技巧和诀窍

1. 用ARC去管理内存(Use ARC to Manage Memory)

2. 适当的地方使用reuseIdentifier(Use a reuseIdentifier Where Appropriate)

3. 尽可能设置视图为不透明(Set View as Opaque When Possible)

4. 避免臃肿的XIBs文件(Avoid Fat XiBs)

5. 不要阻塞主进程(Don't Block the Main Thread)

6. 调整图像视图中的图像尺寸(Size Images to Image Views)

7. 选择正确集合(Choose the Correct Collection)

8. 启用Gzip压缩(Enable GZIP Compression)

9. 重用和延迟加载视图(Reuse and Lazy Load Views)

10. 缓存,缓存,缓存(Cache,Cache,Cache)

11. 考虑绘图(Consider Drawing)

12. 处理内存警告(Handle Memory Warnings)

13. 重用大开销对象(Reuse Expensive Objects)

14. 使用精灵表(Use Sprite Sheets)

15. 避免重复处理数据(Avoid Re-Processing Data)

16. 选择正确的数据格式(Choose the Right Data Format)

17. 适当的设置背景图片(Set Background Images Appropriately)

18. 减少你的网络占用(Reduce Your Web Footprint)

19. 设置阴影路径(Set the Shadow Path)

20. 你的表格视图Optimize Your Table Views)

21. 选择正确的数据存储方式(Choose Correct Data Storage Option)

22. 加速启动时间(Speed up Launch Time)

23. 使用自动释放池(Use AutoRelease Pool)

24. 缓存图像(Cache Images-Or not)

25. 尽可能避免日期格式化器(Avoid Date Formatters Where Possible)

posted @ 2023-05-06 10:55  郎小乐  阅读(110)  评论(0)    收藏  举报