iOS 面试题(二)

面向过程、面向对象 的区别?
面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。  

面向对象:是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。



类别的作用?继承和类别在实现中有何区别?
答案:category:可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除或者修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
(1)
将类的实现分散到多个不同文件或多个不同框架中。
(2)
创建对私有方法的前向引用。
(3)
向对象添加非正式协议。
 
继承:可以增加,修改或者删除方法,并且可以增加属性。

类别和类扩展的区别
 
答案:categoryextensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。
  extensions
可以认为是一个私有的Category

类别的作用
类别主要有3个作用:
(
1)将类的实现分散到多个不同文件或多个不同框架中。
(
2)创建对私有方法的前向引用。
(
3)向对象添加非正式协议。
类别有两方面的局限性:
(
1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。( 无法添加实例变量的局限,可以使用字典对象解决 )
(
2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

代理的作用?What is purpose of delegates?
答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。
  可以减少框架复杂度。

另外一点,代理可以理解为java中的回调监听机制的一种类似。

什么时候用delegate,什么时候用Notification? 
答:
delegate针对one-to-one关系,并且reciever可以返回值sendernotification可以针对one-to-one/many/none,reciever无法返回值给sender.所以,delegate用于sender希望接受到reciever的某个功能反馈值,notification用于通知多个object某个事件。
协议有控制链(has-a)的关系,通知没有。
因此控制链(
has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。


我们说的 oc 是动态运行时语言是什么意思? When we call objective c is runtime language what does it mean?
答案:这个问题其实浅涉及到两个概念,运行时和多态。简单来说。
运行时机制: 使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。(有点像工厂方法)
多态: 主要是将数据类型的确定由编译时,推迟到了运行时,不同对象以自己的方式响应相同的消息的能力叫做多态。
意思就是假设生物类(
life )都用有一个相同的方法 -eat;
那人类属于生物,猪也属于生物,都继承了 life 后,实现各自的 eat ,但是调用是我们只需调用各自的 eat 方法。
也就是不同的对象以自己的方式响应了相同的消息(响应了 eat 这个选择器)。
因此也可以说,运行时机制是多态的基础?

关于多态性:
Polymorphism
答案:多态,子类指针可以赋值给父类。


说说响应链  What is responder chain?
答案:事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。
可以说点事件的分发,传递以及处理。具体可以去看下 touch 事件这块。因为问的太抽象化了
严重怀疑题目出到越后面就越笼统。

frame bounds 有什么不同? Difference between frame and bounds?
答案 :frame 指的是:该 view 在父 view 坐标系统中的位置和大小。(参照点是父亲的坐标系统)
bounds
指的是:该 view 在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)

方法和选择器有何不同? Difference between method and selector?
答案: selector 是一个方法的名称, method 是一个组合体,包含了方法的名称和实现 .

NSOperation queue?
答案:存放 NSOperation 的集合类。
操作和操作队列,基本可以看成 java 中的线程和线程池的概念。用于处理 ios 多线程开发的问题。
网上部分资料提到一点是,虽然是 queue ,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。
这边又有个疑点是,对于队列来说,先进先出的概念是 Afunc 添加进队列, Bfunc 紧跟着也进入队列, Afunc 先执行这个是必然的,
但是 Bfunc 是等 Afunc 完全操作完以后, B 才开始启动并且执行(有多个窗口、或多个MAT机),因此队列的概念离乱上有点违背了多线程处理这个概念。
但是转念一想其实可以参考银行的取票和叫号系统。
因此对于 A B 先排队取票但是 B 率先执行完操作,我们亦然可以感性认为这还是一个队列。
但是后来看到一票关于这操作队列话题的文章,其中有一句提到
因为两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的。 (这句话是错误的,先来先启动,但是谁先执行完是不一定的)
瞬间觉得这个 queue 名字有点忽悠人了,还不如 pool~
综合一点,我们知道他可以比较大的用处在于可以帮组多线程编程就好了。


id nil 代表什么?
id void * 并非完全一样。在上面的代码中, id 是指向 struct objc_object 的一个指针,这个意思基本上是说, id 是一个指向任何一个继承了 Object (或者 NSObject )类的对象。需要注意的是 id 是一个指针,所以你在使用 id 的时候不需要加星号。比如 id foo=nil 定义了一个 nil 指针,这个指针指向 NSObject 的一个任意子类。而 id *foo=nil 则定义了一个指针,这个指针指向另一个指针,被指向的这个指针指向 NSObject 的一个子类。
nil
C 语言的 NULL 相同,在 objc/objc.h 中定义。 nil 表示一个 Objctive-C 对象,这个对象的指针指向空(没有东西就是空)。
首字母大写的 Nil nil 有一点不一样, Nil 定义一个指向空的类(是 Class ,而不是对象)。

nil 用来给对象赋值( Objective-C 中的任何对象都属于 id 类型), NULL 则给任何指针赋值, NULL nil 不能互换, Nil 用于类指针赋值(在 Objective-C 中类是一个类), NSNull 则用于集合操作,虽然它们表示的都是空值,但使用的场合完全不同。
nil  ( 对象:对象指针为空)   表示一个对象的指针指向空 NSURL *url = nil ;
Nil :(空类:类指针为空)         Class  class = Nil ;
NULL (空指针) 则给任何指针赋值  int *pointerInt = NULL ; NSString * str = NULL ;
NSNull (空集合)则用于集合操作
// nil 是一个对象指针为空, Nil 是一个类指针为空, NULL 是基本数据类型为空。
NSNull  对于像 NSArray 这样的类型, nil NULL 不能做为加到其中的 Object ,如果定义了一个 NSArray ,为其分配了内存,又想设置其中的内容为空,则可以用 [NSNULL null 】返回的对象来初始化 NSArray 中的内容


Provider 是指某个 iPhone 软件的 Push 服务器,这篇文章我将使用 .net 作为 Provider  

APNS
Apple Push Notification Service Apple Push 服务器)的缩写,是苹果的服务器。
上图可以分为三个阶段。
第一阶段: .net 应用程序把要发送的消息、目的 iPhone 的标识打包,发给 APNS  
第二阶段: APNS 在自身的已注册 Push 服务的 iPhone 列表中,查找有相应标识的 iPhone ,并把消息发到 iPhone  
第三阶段: iPhone 把发来的消息传递给相应的应用程序,并且按照设定弹出 Push 通知。
http://blog.csdn.net/zhuqilin0/article/details/6527113    //
消息推送机制
看内存泄露时候:在搜索中搜索 run 找到 Run Static Snalyzer .


20.一个objc对象的isa的指针指向什么?有什么作用?
指向他的类对象:从而可以找到对象上的方法

24. objc中的类方法和实例方法有什么本质区别和联系?
类方法:
1.是属于类对象的
2.只能通过类对象调用
3.类方法中的 self 是类对象
4.可以调用其他的类方法
5.不能访问成员变量
6.不定直接调用对象方法

实例方法:
1.是属于实例对象的
2只能通.过实例对象调用
3.实例方法中的 self 是实例对象
4.可以访问成员变量
5.可以直接调用实例方法
6.也可以调用类方法 ( 通过类名 )

 华为
1、局部变量能否和全局变量重名?
           答:能,局部会屏蔽全局。要用全局变量,需要使用"::"
           局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而
           不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变
           量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那
           个循环体内
 2、如何引用一个已经定义过的全局变量?
           答:extern
           可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个
           在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你
           extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
           答:可以在不同的C文件中声明同名的全局变量,以static形式来声明,前提是其中只能有一个C文件中对此变量赋初值,
此时连接不会出错

4、语句for(1)有什么问题?它是什么意思?
           答:和while(1)相同。
5do……whilewhile……do有什么区别?
           答:前一个循环一遍再判断,后一个判断以后再循环

试题2:以下为Windows NT下的32C++程序,请计算sizeof的值
void Func ( char str[100] )
{
 sizeof( str ) = ?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
  解答:
sizeof( str ) = 4
sizeof ( p ) = 4
  剖析:
  Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

数组名的本质如下:
1)数组名指代一种数据结构,这种数据结构就是数组;
  例如:
char str[10];
cout
<<sizeof(str)<<endl;
  输出结果为10str指代数据结构char[10]
2)数组名可以转换为:指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;
char str[10];
str++; //
编译出错,提示str不是左值 
3)数组名作为函数形参时,沦为普通指针。
  Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str )sizeof ( p )都为4

 试题3:写一个标准MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?
least = MIN(*p++, b);


 解答:
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
MIN(*p++, b)
会产生宏的副作用


MIN(*p++, b)的作用结果是:
((*p++) <= (b) ? (*p++) : (*p++))
  这个表达式会产生副作用,指针p会作三次++自增操作。







可扩展标记语言 extensible markup language;XML
2.用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
3
,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是存储数据。
4.XML
HTML的设计区别是:XML的核心是数据,其重点是数据的内容。而HTML被设计用来显示数据,其重点是数据的显示。
5.XML
HTML语法区别:HTML的标记不是所有的都需要成对出现,XML则要求所有的标记必须成对出现;HTML标记不区分大小写,XML则大小敏感,即区分大小写。

 
结合
   XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows,Mac OS,Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。
  XML去掉了之前令许多开发人员头疼的SGML(标准通用标记语言)的随意语法。在XML中,采用了如下的语法:
  1任何的起始标签都必须有一个结束标签
  2可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<tag/ >XML解析器会将其翻译成<tag></tag>
  3标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如this is asamplestring。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
  4所有的特性都必须有值。
  5所有的特性都必须在值的周围加上双引号。



HTTP协议详解
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中。
 http
(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
HTTP
协议的主要特点可概括如下:
1.
支持客户/服务器模式。
2.
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GETHEADPOST
    每种方法规定了客户与服务器联系的类型不同。由于
HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
    采用这种方式可以节省传输时间。

5.
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。



TCP/UDP区别联系
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 
UDP---
用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快 

TCPTransmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次对话才能建立起来,
我们来看看这三次对话的简单过程:
1.主机A向主机B发出连接请求数据包;
2.主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包;
3.主机A再发出一个数据包确认主机B的要求同步:我现在就发,你接着吧!,这是第三次对话。
三次对话的目的是使数据包的发送和接收同步,经过三次对话之后,主机A才向主机B正式发送数据。 
UDPUser Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!  UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。 
tcp
协议和udp协议的差别 
是否连接面向连接面向非连接 
传输可靠性可靠不可靠 
应用场合传输大量数据少量数据 
速度慢快

socket 连接、 http 连接的区别
简单说,你浏览的网页(网址以http://开头)都是http协议传输到你的浏览器的,http是基于socket之上的。socket是一套完成tcpudp协议的接口。
HTTP协议:简单对象访问协议,对应于应用层  HTTP协议是基于TCP连接的
tcp
协议:   对应于传输层
ip
协议:    对应于网络层
TCP/IP
是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。

Socket:
是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
http
连接:http连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;
socket
连接:socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。所以当一个socket连接中没有数据的传输,那么为了维持连接需要发送心跳消息~~具体心跳消息格式是开发者自己定义的
我们已经知道网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是一切皆文件,都可以用打开open –>读写write/read –>关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/IO、打开、关闭),这些函数我们在后面进行介绍。我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTPFTPTELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。
1)Socket
是一个针对TCPUDP编程的接口,你可以借助它建立TCP连接等等。而TCPUDP协议属于传输层 
 
http是个应用层的协议,它实际上也建立在TCP协议之上。 
 (HTTP
是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。)
 2
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值