2017年面试总结

【1】什么是RSA?用于何种场合?

RSA是一种非对称加密算法,所谓非对称,就是说该算法需要一对秘钥,使用其中一个加密,则需另一个才能解密。

RSA的缺陷:通常只能用于加密少量数据或者加密秘钥。(RSA的安全性依赖于大数分解,小于1024位的已经被证明是不安全的,而且由于RSA算法进行的都是大数计算,使得RSA最快也比DES慢上百倍)这就是RSA最大的缺陷。

对于明文进行加密,有两种情况需要这样做:
1,如果你要向朋友传送加密数据,并且只希望你的朋友可以解密,这样的话,你就需要先获取你朋友的秘钥对中公开的那个秘钥,然后用这个秘钥进行加密,这样密文只有你朋友可以解密,因为对应的私钥只有你朋友拥有。
2,如果你要向朋友传送一段数据附加你的数字签名,您需要对你的数据进行MD5之类的运算取得数据签名,再对签名进行加密,加密将使用你自己的秘钥中不公开的私钥。你的朋友收到数据以后,用同样的运算获得数据签名,再用你的公钥对加密签名进行解密,比较解密结果与他自己计算出来的签名是否一致,即可确定数据是否的确是你发送的、以及在传输过程中是否被篡改。

例如项目中很简单的一个需求:
C端给密码使用RSA加密,传到S(后台)解密。RSA加密算法是基于一个秘钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密。还可以验签,就是先用私钥对数据加密,然后对加密后的数据进行签名,得到一个签名值。然后再用公钥先验签,证明是对应私钥加密过的数据才解密。主要是为了防止来源不确定的数据。

【2】iOS App性能优化

1:应用在启动时。
应用启动时,只加载启动相关的资源和必须在启动时加载的资源。
2:使用合适的本地图片加载的方式。
(1)[UIImage imageNamed:@""],这种方式加载的图片会加入缓存,如果图片要多次使用,最好使用此方式。
(2)[[UIImage alloc] initWithContentsOfFile:@""] ,这种方式加载的图片不会加入缓存,图片不经常使用时,可以选择这种方式。
3:不要阻塞主线程,开发中除了UI处理外,其他任务尽量放在后台线程加载。
4:UIview
(1)如果view是透明的,需要设置opaque为yes。
(2)使用UItableview或UIcollectionview的重用,并缓存cell的高度。
(3)延迟加载不急需的views。
(4)尽量避免使用代码裁剪图片,如果必须需在后台线程处理。
5:缓存
缓存需要重复显示的数据,比如网络请求、图片。
6:避免对象创建时过多的消耗资源。
假设应用中多次使用日期处理,将保持日期对象全局唯一。
7:对象释放。
(1)ARC中创建对象时,内存会持续升高,在需要时添加自动释放池释放不需要的资源。
(2)及时释放自己开辟的空间。
8:防止死循环。
(1)在头文件中尽量避免import导入头文件,使用@class声明类,在.m文件中使用#import。
(2)在设置代理、block中使用相应的关键字引用对象。
9:数据存储
10:内存警告处理
当系统发出内存警告时,释放不必要的数据的三种方式。第一:APPDelegate中实现applicationDidReceiveMemoryWarning,第二:UIviewcontroller重写didReceiveMemoryWarning,第三:注册通知:UIApplicationDidReceiveMemoryWarningNotification
11:性能检测
静态分析APP:菜单-Product-Analyze 可以定位未使用的变量,内存泄漏 分析APP每个操作占用时间: Instruments-Time profiler。 动态分析内存泄漏:Instruments-Leaks。

性能检测拓展:
Analyze主要分析的问题:
(1)逻辑错误:访问空指针或未初始化的变量
(2)内存管理错误:如内存泄漏等。
(3)声明错误:从未使用过的变量。
(4)API调用错误:未包含使用的库和框架。
其主要优势在于静态分析内存泄漏及代码逻辑错误。因为声明错误、API调用错误,逻辑错误在编译时都会有警告。

【3】objc 发消息给nil对像会发生什么情况?

在Objective-C中向nil发送消息是完全有效的——只是在运行时不会有任何作用。应用不会发生崩溃。
拓展:
(1)nil指oc中对象的空指针。
(2)Nil指oc中类的空指针。
(3)NULL指向其他类型的空指针,如一个c类型的内存指针
若obj为nil:
[obj message]将返回NO,而不是NSException
若obj为NSNull:
[obj message]将抛出异常NSException

【4】ios开发中 +(void)load 与+(void)initialize的区别

共同点:
(1)在不考虑开发者主动调用的情况下系统最多会调用一次。
(2)如果父类和子类都被都被调用,父类的调用一定在子类之前。
(3)都是为了应用运行提前创建合适的运行环境。
(4)在使用时都不要过重的依赖于这两个方法,除非真正必要。
+(void)load:
(1)调用时机比较早,运行环境有不确定因素。具体说来,通常都是App启动前进行调用,当load调用的时候,并不能保证所有类都加载完成且可用,必要时还要自己负责做auto release处理.
(2)对于一个类,如果没有实现load方法就不会调用,不会考虑对NSObject的继承.
(3)父类的load方法会优先于子类调用,类别的load方法一般最后调用不会直接触发initialize的调用。
通俗的讲就是: 在程序启动之前会调用所有的类的(手动实现的)+load方法(没有实现就不调用咯),按(父类->子类->类别)的顺序调用.
+(void)initialize:
(1)initialize的自然调用是在第一次主动使用当前类的时候 (第一次 alloc 时)
(2)在initialize方法收到调用时,运行环境基本健全。
(3)initialize的运行过程中是能保证线程安全的。
(4)和load不同,即使子类不实现initialize方法,会把父类的实现继承过来调用一遍。注意的是在此之前,父类的方法已经被执行过一次了,同样不需要super调用。
通俗的讲就是:在程序启动之后,在第一次创建这个类的对象的时候(也就是分配内存空间alloc的时候),会调用该类的+initialize方法且只调用一次.
总结:
Apple的文档很清楚地说明了initialize和load的区别在于:load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。

【5】产品更新迭代是怎么处理版本兼容

在适配旧版本时,除了基本的宏定义、[UIDevice currentDevice].systemVersion判断,适当的用Runtime,可以大大减少对现有代码的“干涉”,多种方法相结合才是最好的。

【6】 GCD

【7】UIView与CALayer之间的区别与联系?

每一个UIView都包含有一个CALayer对象,CALayer中存储的是UIView 的展示内容数据,负责绘制。UIView 管理CALayer,相当于一个管理者,并具有处理触摸事件的能力(因为uiview继承自uiresponder)。

【8】核心动画里面有哪些常用的动画类?

常用的动画类:CABasicAnimation基础动画,CAKeyframAnimation关键帧动画,CAAnimationGroup动画组;CATransition专场动画。

【9】如何进行网络推送?推送的流程是什么?你的推送是怎么做的?

推送分为网络推送,本地推送。
网络推送APNS,分为注册部分及推送部分。
注册部分:
1,我们的应用向iOS系统注册推送。
2,iOS系统向用户询问是否允许推送。
3,用户允许后,iOS系统向苹果推送服务器索要device token 。
4,苹果推送服务器将device token 返回给我们的应用。
5,我们的应用再将device token 发送给我们的服务器。
推送部分:
1,我们的服务器将推送的消息,以及device token 发送给苹果推送服务器。
2,苹果推送服务器将推送的消息内容发送给我们的用户。
推送注意事项:
1,iOS7与iOS8推送不同。
2,如果指定推送声音本地必须有这个文件。
3,如果用户选择不允许推送,那么无法进行推送。
4,服务器需要配置cer证书,证书生成时,需要CSR证书签名请求。
5,推送是免费的。
6,推送是不可靠的,用户不一定能立即收到该消息。
7,推送消息大小有限制,长度256字节。
8,极光,信鸽这样一些第三方推送服务,实际上都是基于苹果推送本身的,只是对苹果本身的推送封装了一下。

【10】两个app之间的跳转

【11】iOS四种数据存储的方式

(1)NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。
(2)NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储。
(3) Write写入文件,保存本到地方式:永久保存在磁盘中。
(4) SQLite3:采用SQLite数据库来存储数据。SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。
(5)Core Data。Core Data框架提供了对象-关系映射(ORM)的功能。即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。

你可能感兴趣的:(2017年面试总结)