iOS面试题 (1)

文/Peter__Pan(作者)
原文链接:http://www.jianshu.com/p/e7ac8126a15c
从中摘取了一些。

O、简述MVC模式中M、V、C分别指代什么及发挥的作用?

MVC开始是存在于Desktop(桌面)程序中的,M是指数据模型,V是指用户界面,
C则是控制器,使用MVC的目的是将M和V的实现代码分离。C存在的目的则是确保M和V
的同步,一旦M改变,V应该同步更新。

视图是用户看到并与之交互的界面,视图没有真正的处理发生,不管这些数据是联机存储的还
是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。

模型表示企业数据和业务规则,模型返回的数据是中立的,就是说模型与数据格式无关,这样一个
模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用
,所以减少了代码的重复性。

控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。
它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

1、MVC是什么?有什么特性?

MVC是一种设计形式,由模型、视图、控制器3部分组成。
模型:保存应用程序数据的类,处理业务逻辑的类
视图:窗口,控件和其他用户能看到的并且能交互的元素
控制器:将模型和试图绑定在一起,确定如何处理用户输入的类

2、内存管理的几条原则时什么?

谁申请,谁释放
遵循Cocoa Touch的使用原则;
内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,
一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。

3、如何对iOS设备进行性能测试?

Profile-> Instruments ->Time Profiler

4、描述一下iOS SDK中如何实现MVC的开发模式

MVC是模型、试图、控制开发模式,对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,
由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是
控制层,由它负责控制视图,访问模型数据

5、**iPhone5 的屏幕分辨率大小为 1136* 640 **

屏幕分辨率:用于量度位图图像内数据量多少的一个参数。通常表示成ppi(每英寸像素Pixel per inch)。
屏幕物理尺寸不变,分辨率越高,每单位面积内包含的细节(像素点)越多。

6、OSI(Open System Interconnection)开放式系统互联参考模型 把网络协议从逻辑上分为了7层,试列举常见的应用层协议。


在开放系统互连(OSI)模型中的最高层,为应用程序提供服务以保证通信,但不是进行通信的应用程序本身。

Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了
在本地计算机上完成远程主机工作的能力。

FTP文件传输协议是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早
使用的协议之一,它属于网络协议组的应用层。

 HTTP-Hypertext transfer protocol超文本传输协议, 是分布式,协作式,超媒体系统应用之间
的通信协议。是万维网(world wide web)交换信息的基础。

SMTP(Simple MailTransfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址
传送邮件的规则,由它来控制信件的中转方式,它帮助每台计算机在发送或中转信件时找到下一个目的地。

TIME protocol(时间协议)是一个在RFC 868内定义的网络协议。它用作提供机器可读的日期时间资讯。

DNS 是域名系统 (Domain NameSystem) 的缩写,是因特网的一项核心服务,它作为可以将域名和
IP地址相互映射的一个分布式数据库。

SNMP(Simple Network ManagementProtocol,简单网络管理协议)的前身是简单网关监控
协议(SGMP),用来对通信线路进行管理。

TFTP(Trivial FileTransfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户
机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。

7、网络传输层协议中,基于TCP/IP协议和UDP/IP的连接有什么区别?

TCP:TransmissionControl Protocol 传输控制协议TCP是一种面向连接(连接导向)的、
可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。

UDP 是User DatagramProtocol的简称, 中文名是用户数据包协议,是OSI 参考模型中一种无连接的传输层协
议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。

面向连接:是指通信双方在通信时,要事先建立一条通信线路,其有三个过程:建立连接、使用连接和释放连接
。电话系统是一个面向连接的模式,拨号、通话、挂机;TCP协议就是一种面向连接的协议。

面向无连接:是指通信双方不需要事先建立一条通信线路,而是把每个带有目的地址的包(报文分组)送到线路上,
由系统自主选定路线进行传输。邮政系统是一个无连接的模式,天罗地网式的选择路线,天女散花式的传播形式;
IP、UDP协议就是一种无连接协议。

8、iOS中有哪些回调机制,并作简单的比较。

各种回调机制的比较:
1)目标动作对:当两个对象之间有比较紧密的关系时,如视图控制器与其下的某个视图。
2)代理:也叫委托,当某个对象收到多个事件,并要求同一个对象来处理所有事件时。
   委托机制依赖于某个协议定义的方法来发送消息。
3)通告机制:当需要多个对象或两个无关对象处理同一个事件时。
4)Block或者闭包:适用于回调只发生一次的简单任务。

9、列出在编码中哪些编码习惯有助于提高代码质量、软件性能和健壮性,减少程序崩溃。

  • 使用严格的命名规则(如匈牙利命名法)能够避免不必要的类型转换错误。
  • 在编码前先设计好流程图或使用伪代码,清晰化整个设计意图。
  • 对自己的代码进行严格的单元测试(unit testing)。

单元测试是指对软件中的最小可测试单元进行检查和验证。如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。 单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

  • 异常的处理首先不要轻易使用异常的捕获,其次要尽可能捕获具体的异常。对于异常的处理最好能够采用封装的方式,大家统一使用。这样可以保证异常处理的一致性也可以保证当异常出现时性能的稳定。
  • 使用内省的方法检查方法的输入
  • 采用增量式的编程方式。采用增量式编程和测试,会倾向于创建更小的方法和更具内聚性的类。你应该经常评估代码质量,并不时的进行许多小调整,而不是一次修改许多东西。在写了几行代码之后,就应该进行一次构建/测试。在没有得到反馈时,你不要走的太远。
  • 使用工具(如Instrument)来帮助检查内存泄漏、过早释放内存、CPU使用效率等问题。
  • 消除所有的编译警告,警告就是错误。
  • 写防御性的代码,使用内省的方法检查传入的参数。

10、 堆和栈的区别?

 管理方式:
- 对于栈来讲,是由编译器自动管理,无需我们手工控制;
- 对于堆来说,释放工作由程序员控制,容易产生memory leak。
申请大小:
- 栈:栈是向低地址扩展的数据结构,是一块连续的内存的区域
- 堆:是向高地址扩展的数据结构,是不连续的内存区域。
分配方式:
- 堆: 都是动态分配的 ,动态分配由alloc函数进行分配 
- 栈: 的动态分配由编译器进行释放,无需我们手工实现

11、kvc和kvo的区别?

kvc:键值编码,是一种间接访问对象的属性,使用字符串来标示属性
kvo:键值观察机制,提供了观察某一属性变化的方法

12、线程和进程的区别?

·主要不同的是操作系统资源管理方式
·线程是一个进程中不同的执行路径,线程有自己的堆、局部变量
·进程有独立的地址空间,一个线程死掉,整个进程就会死掉

13、

类别的作用?
有时我们需要在一个已经定义好的类中增加一些方法,
而不想去重写该类。可以使用类别对该类扩充新的方法。
*注意:类别只能扩充方法,而不能扩充成员变量。

代理的作用
委托代理(delegate),目的是改变和传递控制链
顾名思义,把某个对象要做的事情委托给别的对象去做。
那么别的对象就是这个对象的代理,代替它来打理要做
的事。反映到程序中,首先要明确一个对象的委托方是
哪个对象,委托所做的内容是什么。
委托机制是一种设计模式。

多态:子类的指针可以赋值给父类 或者  父类引用指向子类对象

14.链表和数组的区别在哪里?

二者都属于一种数据结构

- 从逻辑结构来看
数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的
情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造
成内存浪费;数组可以根据下标直接存取。
链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便
地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据
项,非常繁琐)链表必须根据next指针找到下一个元素

- 从内存存储来看
(静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小
链表从堆中分配空间, 自由度大但是申请管理比较麻烦
从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元
素,就应该用数组;相反, 如果需要经常插入和删除元素就需要用链表
数据结构了。

15、线程与进程的区别和联系?

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。

进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程
中的不同执行路径。

线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以
多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同
时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

16、目标-动作机制

答:目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,
以插座变量的形式保有其动作消息的目标。

动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应
动作而实现的方法。程序需要某些机制来进行事件和指令的翻译。这个机
制就是目标-动作机制。

17、 cocoa touch框架

这些框架包括:
Core Animation
通过Core Animation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。

Core Audio
Core Audio是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。

Core Data提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用或大或小的数据模型。
功能列表:框架分类
   下面是 Cocoa Touch 中一小部分可用的框架:
     音频和视频
       CoreAudio
       OpenAL
       MediaLibrary
       AVFoundation

     数据管理
       Core Data
       SQLite

     图形和动画
       CoreAnimation
       OpenGL ES
       Quartz 2D

      网络
        Bonjour
        WebKit
        BSDSockets

      用户应用
        AddressBook
        CoreLocation
        MapKit
        StoreKit

18、自动释放池是什么,如何工作?

当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的
一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释
放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域
结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。


1)ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 
对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有
copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时
候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.


2) NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般
不用你管的.

3)autorelease和release没什么区别,只是引用计数减一的时机不同而
已,autorelease会在对象的使用真正结束的时候才做引用计数减一。

19、动态绑定

在运行时确定要调用的方法

动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送
出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。
运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一
个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点
确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C 代码中做任何工作,就
可以自动获取动态绑定的好处。您在每次发送消息时,特别是当消息的接收者是动态类型已经确定的对象时,
动态绑定就会例行而透明地发生。

20、TCP长连接与短连接的区别

参考博客: TCP长连接与短连接的区别

21、如何解决低内存问题?

暂时将没有显示window界面销毁,以获得足够的内存。

22、POST请求的数据类型有哪些?

json、xml、二进制、参数拼接;

23、请简述你理解的面向对象思想

A先生需要一台电脑,但是A先生对电脑配置、性能、品牌等方方面面的知识一窍不通。而A先生恰巧有
位经营电脑方面生意的朋友——C先生,C先生对电脑硬件方面很是了解。A先生告诉C先生所需要的电脑
大概什么需求、什么价位。C先生就会提供给A先生其所需的电脑。至于中间筛选、购买、讨价还价的
过程什么的,A先生完全不用管任何一个环节。只需要付费,就能拿到所需的电脑。

24、iOS中frame和bounds的区别?

frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)

bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)

参考博客

25、请简述你理解的内存管理

如果你通过分配和初始化(比如[[XXXClass alloc] init])的方式来创建对象,你就拥有这个对象,
需要负责该对象的释放。这个规则在使用NSObject的便利方法new时,也同样适用。

如果你拷贝一个对象,
你也拥有拷贝得到的对象,需要负责该对象的释放。

如果你保持一个对象,
你就部分拥有这个对象,需要在以后都不再使用的时候释放该对象。

如果你从其他对象那里接
收到一个对象,则你不拥有该对象,也不应该释放它。

26、如何设计一个缓存类?

在程序中使用缓存可以极大的提高程序的运行速度,设计一个简单的缓存类并不需要太复杂的逻辑.

简单的只需要3个接口.

1.存对象

2.取对象

3.删除对象

读取对象
-读取对象的时候先读内存
-内存没有就读文件

保存对象
-保存对象的时候前台保存到内存里
-后台存入到文件里
-内存空间不足就需要先释放一块内存
-收到内存不足的消息的时候删除释放所有的内存

27、什么是懒加载?

懒加载就是懒汉模式,只有用到的时候才回去初始化。也可以理解为延时加载。

举个最简单的例子:tableView中图片的加载显示。

一个延时加载,避免内存过高;一个异步加载,避免线程阻塞。```

28、如何进行网络消息推送?APNS推送(苹果推送服务)的实现过程?APSN和第三方相比有何区别?
>首先应用发送通知,系统弹出提示框询问用户是否允许,当用户允许后向苹果服务器(APNS)请求deviceToken,并由苹果服务器发送给自己的应用,自己的应用将DeviceToken发送给自己的服务器,自己的服务器想要发送网络推送时将deviceToken以及想要推送的信息发送给苹果服务器,苹果服务器将信息发送给应用。
推送信息内容,总容量不超过256个字节;
iOSSDK本身提供的APNS服务器推送,它可以直接推送给目标用户并根据您的方式弹出提示。
**优点:不论应用是否开启,都会发送到手机端;**
缺点:消息推送机制是苹果服务器端控制,个别时候可能会有延迟,因为苹果服务器也有队列来处理所有的消息请求;

>第三方推送机制,普遍使用Socket机制来实现,几乎可以达到及时的发送到目标用户手机端,适用于即时通讯类应用。

>优点:实时的,取决于心跳包的节奏;
>缺点:iOS系统的限制,应用不能长时间的后台运行,所以应用关闭的情况下这种推送机制不可用。

你可能感兴趣的:(iOS面试题 (1))