《2023年最全的iOS面试题及答案.docx》由会员分享,可在线阅读,更多相关《2023年最全的iOS面试题及答案.docx(94页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、史上最全的iOS面试题及答案1 .写一个NSString类的实现+ (id)initWithCString:(c*t char*)nullTerminatedCStringencoding:(NSStringEncoding)encoding;+ (id) stringWithCString: (c*tchar*)nullTerminatedCStringencoding: (NSStringEncoding)encoding(NSString *obj;obj = self allocWithZone: NSDefaultMallocZone();obj = obj initWithCStr
2、ing: nullTerminatedCString encoding: encoding;return AUTORELEASE(obj);类工厂方法的实现是为了向客户提供方便,它们将分 派和初始化合在一个环节中,返回被创建的对象,并进行自动释放解决。这些方法的形式是+ (type)className.(其中 className不涉及任何前 缀)。工厂方法也许不仅仅为了方便使用。它们不仅可以将 分派和初始化合在一起,还可认为初始化过程提供 对象的分派信息。类工厂方法的另一个目的是使类(比如NS Workspace)提供单件实例。虽然init方法可以确认一进行申请内存失败解决试题7存在与试题6同
3、样的问题,在执行char *str =(char *) malloc(lOO);后未进行内存是否申请成功的判断;此外,在 free(str)后未置str为空,导致也许变成一个野”指 针,应加上:str = NULL;试题6的Test函数中也未对malloc的内存进行 释放。剖析:试题47考察面试者对内存操作的理解限度, 基本功扎实的面试者一般都能对的的回答其中5。60的错误。但是要完全解答对的,却也绝非易事。对内存操作的考察重要集中在:(1)指针的理解;(2)变量的生存期及作用范围;(3)良好的动态内存申请和释放习惯。再看看下面的一段程序有什么错误:swap( int* pl,int* p2
4、)(int *p;* p = *pl;* pl= *p2;* p2 = *p;在swap函数中,p是一个“野”指针,有也许指 向系统区,导致程序运营的崩溃。在VC+中 DEBUG运营时提醒错误Access Violation”。该程序 应当改为:swap( int* pl,int* p2 )(int p;p = *pl;* pl = *p2;* p2 = p;HimR=12,12file:/D:/鱼鱼软件/鱼鱼多媒体日记本 /temp/ 56068A28-3D3B-4D8B-9F82-AC1C3E9B128C arc dU.gifT/img 3.内功题试题1 :分别给出BOOL, int, f
5、loat,指针变量与“零值,比较的if语句(假设变量名为var)解答:BOOL 型变量:if(!var)int 型变量:if(var=0)float型变量:const float EPSINON = 0.00001;if (x = - EPSINON) & (x =”或形式。假如写成if(x=0.0),则判为错,得。 分。试题2 :以下为Windows NT下的32位C+程序,请计算sizeof的值void Func ( char str100)sizeof( str) = ?void *p = malloc( 100 );sizeof ( p ) = ?解答:sizeof( str ) =
6、4 sizeof ( p ) = 4剖析:Func ( char str100)函数中数组名作为函数形参 时,在函数体内,数组名失去了自身的内涵,仅仅只 是一个指针;在失去其内涵的同时,它还失去了其常 量特性,可以作自增、自减等操作,可以被修改。数组名的本质如下:(1)数组名指代一种数据结构,这种数据结构 就是数组;例如:char str10;cout sizeof(str) endl;输出结果为10, str指代数据结构char10。(2)数组名可以转换为指向其指代实体的指 针,并且是一个指针常量,不能作自增、自减等操 作,不能被修改;char str10;str+; /编译犯错,提醒str
7、不是左值(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)会产生宏的副作用剖析:这个面试题重要考察面试者对宏定义的使用,宏 定义可以实现类似于函数的功能,但是它终归不是函 数,而宏定义中括弧中的“参数”也不是真的参
8、数,在 宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意 两个问题:(1)谨慎地将宏定义中的“参数”和整个宏用用 括弧括起来。所以,严格地讲,下述解答:#define MIN(A,B) (A) = (B) ? (A) : (B)#define MIN(A,B) (A = B ? A : B )都应判0分;(2)防止宏的副作用。宏定义#define MIN(A,B) (A) = (B) ? (A): (B)对MIN(*p+,b)的作用结果是:(*p+) = (b) ? (*p+) : (*p+)这个表达式会产生副作用,指针p会作三次+ 自增操作。除此之外,另
9、一个应当判。分的解答是:#define MIN(A,B) (A) = (B) ? (A) : (B);这个解答在宏定义的后面加“广,显示编写者对 宏的概念模糊不清,只能被无情地判0分并被面试官 淘汰。试题4 :为什么标准头文献都有类似以下的结 构?#ifndef INCvxWorksh #define INCvxW orksh个类在每次程序运营过程只存在一个实例,但它需要一方面分派一个“生的”实例,然后还必须释放该实 例。工厂方法则可以避免为也许没有用的对象盲目分派内 存。10单件实例是什么Foundation和Application Kit框架中的一些类只允许 创建单件对象,即这些类在当前进
10、程中的唯一实例。 举例来说,NSFileManager和NSWorkspace类在使用 时都是基于进程进行单件对象的实例化。当向这些类 请求实例的时候,它们会向您传递单一实例的一个引 用,假如该实例还不存在,则一方面进行实例的分派 和初始化。单件对象充当控制中心的角色,负责指引 或协调类的各种服务。假如类在概念上只有一个实例 (比如#ifdef _cplusplus extern C #endif/*.*/#ifdef _cplusplus)#endif#endif /* _INCvxWorksh */ 解答:头文献中的编译宏#ifndef _INCvxW orksh#define _INCv
11、xW orksh#endif的作用是防止被反复弓I用。作为一种面向对象的语言,C+支持函数重载, 而过程式语言C则不支持。函数被C+编译后在 symbol库中的名字与C语言的不同。例如,假设某 个函数的原型为:void foo(int x, int y);该函数被C编译器编译后在symbol库中的名字 为_foo,而C+编译器则会产生像_foo_int_int之类的 名字。_foo_int_int这样的名字包含了函数名和函数 参数数量及类型信息,C+就是考这种机制来实现函 数重载的。为了实现C和C+的混合编程,C+提供了 C 连接互换指定符号extern来解决名字匹配问题,函数声明前加上ext
12、ern后,则编译器就会按照C语言的方式将该函数编译为_f。,这样C语言中就可 以调用C+的函数了。img=12,12file:/D:/鱼鱼软件/鱼鱼多媒体日记本/temp/C74 A38c4-432E-4799-B54D-73E2CD3c5206 arc试题5:编写一个函数,作用是把一个char组成的字 符串循环右移n个。比如本来是“abcdefghi”假如 n=2,移位后应当是“hiabcdefgh”函数头是这样的:/pStr是指向以弱结尾的字符串的指针/steps是规定移动的nvoid LoopMove ( char * pStr, int steps )(请填充)解答:对的解答1 :vo
13、id LoopMove ( char *pStr, int steps )int n 二 strlen( pStr ) - steps;char tmp M AX_LEN;strcpy (tmp, pStr + n );strcpy (tmp + steps, pStr);*( tmp + strlen ( pStr)=0;strcpy( pStr, tmp );对的解答2 :void LoopMove ( char *pStr, int steps ) (int n = strlen( pStr) - steps;char tmp M AX_LEN;memcpy( tmp, pStr + n
14、, steps );memcpy(pStr + steps, pStr, n );memcpy(pStr, tmp, steps);剖析:这个试题重要考察面试者对标准库函数的纯熟限 度,在需要的时候引用库函数可以很大限度上简化程 序编写的工作量。最频繁被使用的库函数涉及:(1) strcpymemcpy(2) memsetNS Workspace),就应当产生一个单件实例,而不是多个实例;假如将来某一天也许有多个实例,您可 以使用单件实例机制,而不是工厂方法或函数。11动态绑定在运营时拟定要调用的方法动态绑定将调用方法的拟定也推迟到运营时。在编译 时,方法的调用并不和代码绑定在一起,只有在消实
15、 发送出来之后,才拟定被调用的代码。通过动态类型 和动态绑定技术,您的代码每次执行都可以得到不同 的结果。运营时因子负责拟定消息的接受者和被调用 的方法。运营时的消息分发机制为动态绑定提供支 持。当您向一个动态类型拟定了的对象发送消息时, 运营环境系统会通过接受者的isa指针定位对象的 类,并以此为起点拟定被调用的方法,方法和消息是 动态绑定的。并且,您不必在Objective-C代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时,特别是当消息的接受者是动态类型已经拟定的对象时,动态绑定就会例行而透明地发生。12obj-c的优缺陷objc优点:1) Cateogies2) Po
16、sing3)动态辨认4)指标计算5)弹性讯息传递6)不是一个过度复杂的C衍生语言7) Objective-C与C+可混合编程缺陷:1)不支援命名空间2)不支持运算符重载3)不支持多重继承4)使用动态运营时类型,所有的方法都是函数调 用,所以很多编译时优化方法都用不到。(如内联函 数等),性能低劣。13sprintf,strcpy,memcpy使用上有什么要注意的地方strcpy是一个字符串拷贝的函数,它的函数原型为 strcpy(char *dst, c*t char *src);将src开始的一段字符串拷贝到dst开始的内存中 去,结束的标志符号为由于拷贝的长度不是由 我们自己控制的,所以这
17、个字符串拷贝很容易犯错。具有字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(char *dst, c*t char* src, unsigned int len);将长度为len的一段内存,从src拷贝到dst中去,这 个函数的长度可控。但是会有内存叠加的问题。sprintf是格式化函数。将一段数据通过特定的格式, 格式化到一个字符串缓冲区中去。sprintf格式化的函 数的长度不可控,有也许格式化后的字符串会超过缓 冲区的大小,导致溢出。14答案是:a) int a; / An integerint *a; A pointer to an integer
18、b) int / A pointer to a pointer to an integerint a10; / An array of 10 integersc) int / An array of 10 pointers to integersint (*a)10; / A pointer to an array of 10 integersd) int (*a)(int); / A pointer to a function a that takes an integer argument and returns an integerint (*a10)(int); / An array
19、of 10 pointers to functi* that take an integer argument and return an integer15.read write, readonly, assign, retain, copy, nonatomic属 性 的 作用property是一个属性访问声明,扩号内支持以下几 个属性:1, getter=getterName, setter=setterName,设立 setter 与getter的方法名readwrite,readonly,设立可供访问级别2, assign, setter方法直接赋值,不进行任何retain 操作,为
20、了解决原类型与环循引用问题retain, setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)copy, setter方法进行Copy操作,与retain解决 流程同样,先旧值release,再Copy出新的对象, retainCount为1。这是为了减少对上下文的依赖而引 入的机制。copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。3, nonatomic,非原子性访问,不加同步,多线程并 发访问会提高性能。注意,假如不加此属性,则默认 是两个访问方法都为原子型事务访问。锁被加到所属 对象实例级(我是这么理解的)。a
21、tomic和nonatomic用来决定编译器生成的getter和 setter是否为原子操作。在多线程环境下,原子操作 是必要的,否则有也许引起错误的结果。加了 atomic, setter函数会变成下面这样:16什么时候用delegate,什么时候用Notification ?答:delegate 针对 one-to-one 关系,并且 reciever 可以 返回值给 sender, notification 可以针对 one-to- one/many/none,reciever 无法返 回值给 sender.所以, delegate用于sender希望接受到reciever的某个功能 反
22、馈值,notification用于告知多个object某个事件。17 什么是 KVC 和 KVO ?答:KVC(Key-Value- Coding)内部的实现:一个对象在调用setValue的时 候,(1)一方面根据方法名找到运营方法的时候所 需要的环境参数。(2)他会从自己isa指针结合环 境参数,找到具体的方法实现的接口。(3)再直接 查找得来的具体的方法实现。KVO (Key-Value- Observing) :当观测者为一个对象的属性进行了注 册,被观测对象的isa指针被修改的时候,isa指针就 会指向一个中间类,而不是真实的类。所以isa指针 其实不需要指向实例对象真实的类。所以我
23、们的程序 最佳不要依赖于isa指针。在调用类的方法的时候, 最佳要明确对象实例的类名18ViewController loadView, viewDidLoad, viewDidUnload分别是在什么时候调用的?在自定义 ViewController的时候这几个函数里面应当做什么工 作?答:viewDidLoad在view从nib文献初始化时调 用,load View 在 controller 的 view 为 nil 时调用。此 方法在编程实现view时调用,view控制器默认会注册 memory warning notification,当 view controller 的任彳可 vi
24、ew没有用的时候,viewDidUnload会被调用,在这 里实现将retain的view release,假如是retain的IB Outlet view属性则不要在这里release,IBOutlet会负 责 release o19“NSMutableString *”这个数据类型则是代表 “NSMutableString”对象自身,这两者是有区别的。而NSString只是对象的指针而已。2static关键字的作用:(1)函数体内static变量的作用范围为该函数体, 不同于auto变量,该变量的内存只被分派一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的static全局变量可以
25、被模块内所用 函数访问,但不能被模块外其它函数访问;(3)在模块内的static函数只可被这一模块内的其 它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static成员变量属于整个类所拥有, 对类的所有对象只有一份拷贝;(5)在类中的static成员函数属于整个类所拥有, 这个函数不接受this指针,因而只能访问类的 static成员变量。3线程与进程的区别和联系?面向过程就是分析出解决问题所需要的环节,然后用 函数把这些环节一步一步实现,使用的时候一个一个 依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对 象的目的不是为了完毕一个环节,而是为了描叙某个
26、事物在整个解决问题的环节中的行为。;20类别的作用类别重要有3个作用:将类的实现分散到多个不同文献或多个不同框架 中。(2)创建对私有方法的前向引用。(3)向对象添加非正式协议。类别的局限性 有两方面局限性:无法向类中添加新的实例变量,类别没有位置容 纳实例变量。名称冲突,即当类别中的方法与原始类方法名称 冲突时,类别具有更高的优先级。类别方法将完全取 代初始方法从而无法再使用初始方法。无法添加实例变量的局限可以使用字典对象解决21关键字volatile有什么含意?并给出三个不同的例子: 一个定义为volatile的变量是说这变量也许会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
27、精确地说就是,优化器在用到 这个变量时必须每次都小心地重新读取这个变量的 值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:并行设备的硬件寄存器(如:状态寄存器),一个中断服务子程序中会访问到的非自动变量(Non- automatic variables)多线程应用中被几个任务共享的变量 一参数既可以是const还可以是volatile吗?解释 为什么。,一个指针可以是volatile吗?解释为什么。下面是答案:是的。一个例子是只读的状态寄存器。它是volatile 由于它也许被意想不到地改变。它是const由于程序 不应当试图去修改它。是的。尽管这并不很常见。一个例子
28、是当一个中服 务子程序修该一个指向一个buffer的指针时。22synthesize是系统自动生成getter和setter属性声 明dynamic是开发者自已提供相应的属性声明dynamic意思是由开发人员提供相应的代码:对于 只读属性需要提供setter,对于读写属性需要提供setter和gettero synthesize意思是,除非开发人 员已经做了,否则由编译器生成相应的代码,以满足 属性声明。查阅了一些资料拟定dynamic的意思是告诉编译器, 属性的获取与赋值方法由用户自己实现,不自动生成。23Difference between shallow copy and deep co
29、py?浅复制和深复制的区别?答案:浅层复制:只复制指向对象的指针,而不复制 引用对象自身。深层复制:复制弓I用对象自身。意思就是说我有个A对象,复制一份后得到A_copy 对象后,对于浅复制来说,A和A_copy指向的是同 一个内存资源,复制的只但是是是一个指针,对象自 身资源还是只有一份,那假如我们对A_copy执行了修改操 作,那么发现A引用的对象同样被修改,这其实违反 了我们复制拷贝的一个思想。深复制就好理解了,内 存中存在了两份独立对象自身。用网上一哥们通俗的话将就是:浅复制好比你和你的影子,你完蛋,你的影子也完蛋 深复制好比你和你的克隆人,你完蛋,你的克隆人还 活着。24What i
30、s advantage of categories? What is difference between implementing a category and inheritance?类别的作用?继承和类别在实现中有何区别?答案:category可以在不获悉,不改变本来代码的情况下往里面添加新的方法,只能添加,不能删除修 改。并且假如类别和本来类中的方法产生名称冲突,则类 别将覆盖本来的方法,由于类别具有更高的优先级。类别重要有3个作用:将类的实现分散到多个不同文献或多个不同框架 中。(2)创建对私有方法的前向引用。向对象添加非正式协议。继承可以增长,修改或者删除方法,并且可以增长属性。2
31、5 .Difference between categories and extensions?类别和类扩展的区别。答案:category和extensions的不同在于后者可以添 加属性。此外后者添加的方法是必须要实现的。extensions可以认为是一个私有的Category o.Difference between protocol in objective c and interfaces in java?OC中的协议和java中的接口概念有何不同?答案:OC中的代理有2层含义,官方定义为formal 和 informal protocolo 前者和 Java 接口 同样。inform
32、al protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是假如有实现,就会改变类的属 性。其实关于正式协议,类别和非正式协议我很早前学习 的时候大体看过,也写在了学习教程里“非正式协议概念其实就是类别的另一种表达方式“这 里有一些你也许希望实现的方法,你可以使用他们更 好的完毕工作:这个意思是,这些是可选的。比如我门要一个更好的 方法,我们就会申明一个这样的类别去实现。然后你 在后期可以直接使用这些更好的方法。这么看,总觉得类别这玩意儿有点像协议的可选协议。”现在来看,其实protocal已经开始对两者都统一和规 范起来操作,由于资料中说“非正式协议使用 interface 修饰
33、“,现在我们看到协议中两个修饰词:“必须实现(requiedy和“可选实现(optional)”。26What are KVO and KVC?答案:kvc:键-值编码是一种间接访问对象的属性使 用字符串来标记属性,而不是通过调用存取方法,直 接或通过实例变量访问的机制。很多情况下可以简化程序代码。apple文档其实给了 一个很好的例子。kvo:键值观测机制,他提供了观测某一属性变化的方 法,极大的简化了代码。具体用看到嗯哼用到过的一个地方是对于按钮点击变 化状态的的监控。比如我自定义的一个buttoncppself addObserver: self forKeyPath: highligh
34、ted options:0 context:nil;#pragma mark KVO-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context: (void *)context(if (keyPath isEqualToString:highlighted) self setNeedsDisplay ;)对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是同样的。对于kvc机制如何通过key寻找到value
35、 :“当通过KVC调用对象时,比如:selfvalueForKey:someKey”时,程序会自动试图通过几种不同的方式解析这个调用。一方面查找对象是否 带有someKey这个方法,假如没找到,会继续查找 对象是否带有someKey这个实例变量(iVar),假如 还没有找到,程序会继续试图调用-(id) valueForUndefinedKey:这个方法。假如这个方法还是 没有被实现的话,程序会抛出一个 NSUndefinedKeyException 异常错误。( 注:Key-Value Coding 查找方法的时 候,不仅仅会查找someKey这个方法,还会查找 getsomeKey这个方法
36、,前面加一个get,或者 _someKey以及_getsomeKey这几种形式。同时,查 找实例变量的时候也会不仅仅查找someKey这个变 量,也会查找_someKey这个变量是否存在。) 设计valueForUndefinedKey:方法的重要目的是当你使 用.(id)valueForKey方法从对象中请求值时,对象可 以在错误发生前,有最后的机会响应这个请求。这样 做有很多好处,下面的两个例子说明了这样做的好 处。“ 进程和线程都是由操作系统所体会的程序运营的基本 单元,系统运用该基本单元实现系统相应用的并发 性。程和线程的重要差别在于它们是不同的操作系统资源 管理方式。进程有独立的地址
37、空间,一个进程崩溃 后,在保护模式下不会对其它进程产生影响,而线程 只是一个进程中的不同执行途径。线程有自己的堆栈 和局部变量,但线程之间没有单独的地址空间,一个 线程死掉就等于整个进程死掉,所以多进程的程序要 比多线程的程序健壮,但在进程切换时,花费资源较 大,效率要差一些。但对于一些规定同时进行并且又 要共享某些变量的并发操作,只能用线程,不能用进 程。4堆和栈的区别 来至cocoa,这个说法应当挺有道理。由于我们知道button却是存在一个highlighted实例变 量.因此为什么上面我们只是add一个相关的keypath 就行了,27What is purpose of delega
38、tes?代理的作用?答案:代理的目的是改变或传递控制链。允许一个类 在某些特定期刻告知到其他类,而不需要获取到那些 类的指针。可以减少框架复杂度。此外一点,代理可以理解为java中的回调监听机制 的一种类似。28What are mutable and immutable types in Objective C? oc中可修改和不可以修改类型。答案:可修改不可修改的集合类。这个我个人简朴理 解就是可动态添加修改和不可动态添加修改同样。比如NS Array和NSMutable Array o前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间29When we c
39、all objective c is runtime language what does it mean?我们说的OC是动态运营时语言是什么意思?答案:多态。重要是将数据类型的拟定由编译时,推 迟到了运营时。这个问题其实浅涉及到两个概念,运营时和多态。简朴来说,运营时机制使我们直到运营时才去决定一 个对象的类别,以及调用该类别对象指定方法。多态:不同对象以自己的方式响应相同的消息的能力 叫做多态。意思就是假设生物类(life)都用有一个 相同的方法-eat;那人类属于生物,猪也属于生物,都继承了 life后, 实现各自的eat,但是调用是我们只需调用各自的eat 方法。也就是不同的对象以自己
40、的方式响应了相同的消息(响应了 eat这个选择器)。因此也可以说,运营时机制是多态的基础?一30what is difference between NSNotification and protocol?告知和协议的不同之处?答案:协议有控制链(has-a)的关系,告知没有。一方面我一开始也不太明白,什么叫控制链(专业术 语了)。但是简朴分析下告知和代理的行为模式, 我们大体可以有自己的理解简朴来说,告知的话,它可以一对多,一条消息可以 发送给多个消息接受者。代理按我们的理解,到不是直接说不能一对多,比如 我们知道的明星经济代理人,很多时候一个经济人负 责好几个明星的事务。只是对于不同明星间
41、,代理的事物对象都是不同样 的,一一相应,不也许说明天要解决A明星要一个 发布会,代理人发出解决发布会的消息后,别称B的发布会了。但是告知就不同样,他只关心发出告知, 而不关心多少接受到感爱好要解决。因此控制链(has-a从英语单词大体可以看出,单一 拥有和可控制的相应关系。31 What is push notification?什么是推送消息?答案:太简朴,不作答这是cocoa上的答案。其实到不是说太简朴,只是太泛泛的一个概念的东西。就好比说,什么是人。推送告知更是一种技术。简朴点就是客户端获取资源的一种手段。普通情况下,都是客户端积极的pull。推送则是服务器端积极pusho.Polym
42、orphism ?关于多态性答案:多态,子类指针可以赋值给父类。这个题目其实可以出到一切面向对象语言中,因此关于多态,继承和封装基本最佳都有个自我意识 的理解,也并非一定要把书上资料上写的能背出来。 最重要的是转化成自我理解。33What is responder chain?说说响应链答案:事件响应链。涉及点击事件,画面刷新事件 等。在视图栈内从上至下,或者从下之上传播。可以说点事件的分发,传递以及解决。具体可以去看 下touch事件这块。由于问的太抽象化了 严重怀疑题目出到越后面就越笼统。34Difference between frame and bounds?frame和bounds有
43、什么不同?答案:frame指的是:该view在父view坐标系统中的 位置和大小。(参照点是父亲的坐标系统)bounds指的是:该view在自身坐标系统中的位置和 大小。(参照点是自身坐标系统)35.Difference between method and selector?方法和选择器有何不同?答案:selector是一个方法的名字,method是一个组 合体,包含了名字和实现.36NSOperation queue?答案:存放NSOperation的集合类。操作和操作队列,基本可以当作java中的线程和线 程池的概念。用于解决ios多线程开发的问题。网上部分资料提到一点是,虽然是queu
44、e,但是却并 不是带有队列的概念,放入的操作并非是按照严格的 先进现出。这边又有个疑点是,对于队列来说,先进先出的概念 是Afunc添加进队列,Bfunc紧跟着也进入队列, Afunc先执行这个是必然的,但是Bfunc是等Afunc完全操作完以后,B才开始启 动并且执行,因此队列的概念离乱上有点违反了多线 程解决这个概念。但是转念一想其实可以参考银行的取票和叫号系统。因此对于A比B先排队取票但是B率先执行完操作,我们亦然可以感性认为这还是一个队列。但是后来看到一票关于这操作队列话题的文章,其中 有一句提到“由于两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的。”瞬间觉得这个queu
45、e名字有点忽悠人了,还不如pool 综合一点,我们知道他可以比较大的用处在于可以帮 组多线程编程就好了。37What is lazy loading?答案:懒汉模式,只在用到的时候才去初始化。也可以理解成延时加载。我觉得最佳也最简朴的一个列子就是tableView中图 片的加载显示了。一个延时载,避免内存过高,一个异步加载,避免线 程堵塞。38Can we use two tableview controllers on one viewcontroller?是否在一个视图控制器中嵌入两个tableview控制器?答案:一个视图控制只提供了一个View视图,理论 上一个tableViewCon
46、troller也不能放吧,只能说可以嵌入一个tableview视图。当然,题目自 身也有歧义,假如不是我们定性思维认为的UIV iewController,而是宏观的表达视图控制者,那我们倒是可以把其当 作一个视图控制者,它可以控制多个视图控制器,比 如 TabbarController那样的感觉。39Can we use one tableview with two different datasources? How you will achieve this?一个tableView是否可以关联两个不同的数据源?你会怎么解决?答案:一方面我们从代码来看,数据源如何关联上 的,其实是在数据源关联的代理方法里实现的。因此我们并不关心如何去关联他,他怎么关联上,方 法