2023年最全的iOS面试题及答案.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2023年最全的iOS面试题及答案.docx》由会员分享,可在线阅读,更多相关《2023年最全的iOS面试题及答案.docx(94页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 年最全 iOS 试题 答案
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内