2018-05-10

作者: 鄭经仁 | 来源:发表于2018-05-10 11:12 被阅读0次

                                            面试题

1. Cocoa框架是指Foundation框架和Application kit框架;Cocoa Touch框架是指Foundation框架和UIKit框架。Cocoa框架用于Mac OS X桌面和笔电脑用程序的开,而Cocoa Touch框架用于iPhoneiTouch用程序开

Cocoa Touch框架下,UIKit代替了AppKit框架,UIKit框架也提供了很多类,可以为很多相同类型的对象提供支持,如窗口、视图、按钮和文本域等。

Cocoa Touch层的关键技术包括:多任务、打印、数据保护、苹果推通知服务、本地通知、手势识别器、标准系统View Controller等

·  本地推送:不需要联网也可以推送,是开发人员在APP内设定特定的时间来提醒用户干什么

·  远程推送:需要联网,用户的设备会于苹果APNS服务器形成一个长连接,用户设备会发送uuid和Bundle

idenidentifier给苹果服务器,苹果服务器会加密生成一个deviceToken给用户设备,然后设备会将deviceToken发送给APP的服务器,服务器会将deviceToken存进他们的数据库,这时候如果有人发送消息给我,服务器端就会去查询我的deviceToken,然后将deviceToken和要发送的信息发送给苹果服务器,苹果服务器通过deviceToken找到我的设备并将消息推送到我的设备上,这里还有个情况是如果APP在线,那么APP服务器会于APP产生一个长连接,这时候APPF服务器会直接通过deviceToken将消息推送到设备上。

2. Instruments提供了很多功能,我会重点介绍一下我最常用的几类:

  1.Time Profiler:CPU分析工具分析代码的执行时间。

  2.Core Animation:离屏渲染,图层混合等GPU耗时。

  3.Leaks:内存检测,内存泄漏检测工具。

  4.Energy Log:耗电检测工具。

  5.Network:流量检测工具。

3. 什么是runtime(运行时机制):

  Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发。

    1.runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。

    2.平时编写的OC代码, 在程序运行过程中, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者

runtime的作用

  runtime是属于OC的底层, 可以进行一些非常底层的操作(用OC是无法现实的, 不好实现)。

    1.在程序运行过程中, 动态创建一个类(比如KVO的底层实现)

    2.在程序运行过程中, 动态地为某个类添加属性\方法, 修改属性值\方法

    3.遍历一个类的所有成员变量(属性)\所有方法

runtime相关应用

  * NSCoding(归档和解档, 利用runtime遍历模型对象的所有属性)

  * 字典 --> 模型 (利用runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)

  * KVO(利用runtime动态产生一个类)

  * 用于封装框架(想怎么改就怎么改)

4. 什么是 Runloop?

是一个与线程相关的机制,可以理解为一个循环,在这个循环里面等待事件然后处理事件.而这个循环是基于线程的,在Cocoa中每个线程都有它的runroop,通过他这样的机制,线程可以在没有事件要处理的时候休息,有事件运行,减轻CPU压力,这题可以衍生出为什么在滑动时会导致定时器失败,在下面有解答

5. 当系统出现内存警告时会发生什么?

会将不在当前窗口上的view暂时移除

如果放任内存警告,最终会导致软件强制被系统关闭

6. 为什么NotificationCenter 要removeObserver? 如何实现自动remove?

如果不移除的话,万一注册通知的类被销毁以后又发了通知,程序会崩溃.因为向野指针发送了消息

实现自动remove:通过自释放机制,通过动态属性将remove转移给第三者,解除耦合,达到自动实现remove

7.什么时候会发生 EXC BAD ACCESS 异常?

访问一个僵尸对象,访问僵尸对象的成员变量或者向其发消息

死循环

8.NSNotification KVO 的使用景?

KVO使用场景:当一个对象的特定属性改变的时候,需要被通知一个或者多个对象的时候

NSNotification使用场景:跨层级传递值,多个对象通知多个对象

9.使用 Block 时需要注意哪些问题

在block内部使用外部指针且会造成循环引用情况下,需要用__weak修饰外部指针__weak typeof(self) weakSelf = self;

在block内部如果调用了延时函数还使用弱指针会取不到该指针,因为已经被销毁了,需要在block内部再将弱指针重新强引用一下__strong typeof(self) strongSelf = weakSelf;

如果需要在block内部改变外部变量的话,需要在用__block修饰外部变量

[if !supportLineBreakNewLine]

[endif]

10哪些途径可以让 ViewController 瘦下来?

[if !supportLists]·      [endif]将网络请求抽象到独的

[if !supportLists]·      [endif]将界面的封装抽象到专门

[if !supportLists]·      [endif]构造 ViewModel

[if !supportLists]·      [endif]专门构造存储类

[if !supportLists]·      [endif]整合常量

11.有哪些常 Crash 场景

访问了僵尸对象

访问了不存在的方法

数组越界

在定时器下一次回调前将定时器释放,会Crash

12. NSOperation 相比于 GCD 有哪些优势?

提供了在 GCD 中不那么容易复制的有用特性。

可以很方便的取消一个NSOperation的执行

可以更容易的添加任务的依赖关系

提供了任务的状态:isExecuteing,    isFinished.

[if !supportLists]·       [endif]iOS多线程技术有哪几种方式?

[if !supportLists]·       [endif]答:pthread、NSThread、GCD、NSOperation

13 .

strong / weak / unsafe_unretained 的区别?

weak只能修饰OC对象,使用weak不会使计数器加1,对象销毁时修饰的对象会指向nil

strong等价与retain,能使计数器加1,且不能用来修饰数据类型

unsafe_unretained等价与assign,可以用来修饰数据类型和OC对象,但是不会使计数器加1,且对象销毁时也不会将对象指向nil,容易造成野指针错误

14.

  1、KVC简介

键值编码 是一种通过字符串间接访问对象的方式(即给属性赋值)

  2KVO

键值观察者 (Key-Value Observer): KVO 是观察者模式的一种实现,观察者A监听被观察者B的某个属性,当B的属性发生更改时,A就会收到通知,执行相应的方法

15.什么是TCP / UDP ?

HTTPS和HTTP的区别主要为以下四点:

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。

二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全

1.TCP是面向连接的可靠的传输控制协议,UDP是面向非连接的用户数据报协议.

2.TCP(三次握手保证相对可靠性)可传大量数据,速度相对比较慢,UDP一次性传输少量对可靠性要求不高的数据,速度比较快

16. 内存的五大区

栈,堆,代码区,全局区,文字常量区

栈是系统自动销毁,堆需要程序猿手动销毁

17.block和代理的区别?

block更轻型简单,能够直接访问上下文,代码通常在一个地方,缺点是容易循环引用。

代理更重一点,需要实现接口,它的方法分开来,很多时候需要存储数据,优点是使用weak 不会造成循环引用

18.

浅拷贝:对一个对象地址的拷贝。源对象和副本对象是同一对象

深拷贝:对一个对象的拷贝。源对象和副本对象是不同的两个对象

19.UIViewController生命周期

  1.loadView方法2.viewDidLoad3.viewWillAppear4.viewDidAppear5.viewWillDisappear6.viewDidDisappear

20.UITableViewCell重用机制

UITableView只会创建一屏幕(或者一屏幕多一点)的cell,其他都是取出来重用的。每当cell滑出屏幕的时候,就会放到一个集合中,当要显示某一位置的cell时,会先去集合中取,有的话,就直接拿出来显示,没有在创建。

21.UITableView优化

 1.提前计算并缓存好高度,因为heightForRow最频繁的调用.2.异步绘制3.滑动时按需加载,这个在大量图片展示,网络加载时,很管用4.重用cells。

22.设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情。

1). MVC模式:Model View Control,把模型 视图 控制器 层进行解耦合编写。

2). MVVM模式:Model View ViewModel 把模型 视图 业务逻辑 层进行解耦和编写。

3). 单例模式:通过static关键词,声明全局变量。在整个进程运行期间只会被赋值一次。

4). 观察者模式:KVO是典型的通知模式,观察某个属性的状态,状态发生变化时通知观察者。

5). 委托模式:代理+协议的组合。实现1对1的反向传值操作。

6). 工厂模式:通过一个类方法,批量的根据已有模板生产对象。

相关文章

网友评论

    本文标题:2018-05-10

    本文链接:https://www.haomeiwen.com/subject/fblzrftx.html