iOS面试题2Word格式文档下载.docx
- 文档编号:6533025
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:26
- 大小:33.74KB
iOS面试题2Word格式文档下载.docx
《iOS面试题2Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《iOS面试题2Word格式文档下载.docx(26页珍藏版)》请在冰点文库上搜索。
懂得在宏中小心地把参数用括号括起来
我也用这个问题开始讨论宏的副作用,例如:
当你写下面的代码时会发生什么事?
least=MIN(*p++,b);
结果是:
((*p++)<
=(b)?
(*p++):
(*p++))
这个表达式会产生副作用,指针p会作三次++自增操作。
4.写一个委托的interface
@protocolMyDelegate;
@interfaceMyClass:
NSObject
{
id<
MyDelegate>
delegate;
}
//委托方法
@protocolMyDelegate
-(void)didJobs:
(NSArray*)args;
@end
5.写一个NSString类的实现
+(id)initWithCString:
(constchar*)nullTerminatedCStringencoding:
(NSStringEncoding)encoding;
+(id)stringWithCString:
(constchar*)nullTerminatedCString
encoding:
(NSStringEncoding)encoding
NSString*obj;
obj=[selfallocWithZone:
NSDefaultMallocZone()];
obj=[objinitWithCString:
nullTerminatedCStringencoding:
encoding];
returnAUTORELEASE(obj);
6.obj-c有多重继承么?
不是的话有什么替代方法?
cocoa中所有的类都是NSObject的子类
多继承在这里是用protocol委托代理来实现的
你不用去考虑繁琐的多继承,虚基类的概念.
ood的多态特性在obj-c中通过委托来实现.
7.obj-c有私有方法么?
私有变量呢
objective-c-类里面的方法只有两种,静态方法和实例方法.这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西.如果没有了私有方法的话,对于一些小范围的代码重用就不那么顺手了.在类里面声名一个私有方法
@interfaceController:
NSObject{
NSString*something;
+(void)thisIsAStaticMethod;
-(void)thisIsAnInstanceMethod;
@interfaceController(private)
-(void)thisIsAPrivateMethod;
@private可以用来修饰私有变量
在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的。
8.关键字const有什么含意?
修饰类呢?
static的作用,用于类呢?
还有externc的作用
const意味着"
只读"
,下面的声明都是什么意思?
constinta;
intconsta;
constint*a;
int*consta;
intconst*aconst;
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
结论:
关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。
(当然,懂得用const的程序员很少会留下的垃圾让
别人来清理的。
)通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。
简而言之,这样可以减少bug
的出现。
(1)欲阻止一个变量被改变,可以使用const关键字。
在定义该const变量时,通常需要对它进行初
始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指
定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
关键字volatile有什么含意?
并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile变量的几个例子:
并行设备的硬件寄存器(如:
状态寄存器)
一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)
多线程应用中被几个任务共享的变量
一个参数既可以是const还可以是volatile吗?
解释为什么。
一个指针可以是volatile吗?
下面是答案:
是的。
一个例子是只读的状态寄存器。
它是volatile因为它可能被意想不到地改变。
它是const因为程序不应该试图去修改它。
尽管这并不很常见。
一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
9.static关键字的作用:
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,
因此其值在下次调用时仍维持上次的值;
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明
它的模块内;
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
extern"
C"
的作用
(1)被extern"
限定的函数或变量是extern类型的;
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,
其声明的函数和变量可以在本模块或其它模块中使用。
(2)被extern"
修饰的变量和函数是按照C语言方式编译和连接的;
的惯用法
(1)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进
行下列处理:
{
#include"
cExample.h"
}
而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern"
声明,
在.c文件中包含了extern"
时会出现编译语法错误。
(2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern"
,但是在C语言中不
能直接引用声明了extern"
的该头文件,应该仅将C文件中将C++中定义的extern"
函数声明为
extern类型。
10.为什么标准头文件都有类似以下的结构?
#ifndef__INCvxWorksh
#define__INCvxWorksh
#ifdef__cplusplus
#endif
/*...*/
#endif/*__INCvxWorksh*/
显然,头文件中的编译宏“#ifndef__INCvxWorksh、#define__INCvxWorksh、#endif”的作用
是防止该头文件被重复引用。
10.#import跟#include的区别,@class呢?
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import。
而#import比起#include的好处就是不会引起交叉编译。
11.MVC模式的理解
MVC设计模式考虑三种对象:
模型对象、视图对象、和控制器对象。
模型对象代表特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。
视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。
控制器对象是应用程序的视图对象和模型对象之间的协调者。
12.线程与进程的区别和联系?
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。
所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
13.列举几种进程的同步机制,并比较其优缺点。
答案:
原子操作信号量机制自旋锁管程,会合,分布式系统
1.进程之间通信的途径
共享存储系统消息传递系统管道:
以文件系统为基础
2.进程死锁的原因
资源竞争及进程推进顺序非法
3.死锁的4个必要条件
互斥、请求保持、不可剥夺、环路
4.死锁的处理
鸵鸟策略、预防策略、避免策略、检测与解除死锁
14.堆和栈的区别
管理方式:
对于栈来讲,是由编译器自动管理,无需我们手工控制;
对于堆来说,释放工作由程序员控制,容易产生memoryleak。
1.申请大小:
栈:
在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。
这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。
因此,能从栈获得的空间较小。
堆:
堆是向高地址扩展的数据结构,是不连续的内存区域。
这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。
堆的大小受限于计算机系统中有效的虚拟内存。
由此可见,堆获得的空间比较灵活,也比较大。
2.碎片问题:
对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。
对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
3.分配方式:
堆都是动态分配的,没有静态分配的堆。
栈有2种分配方式:
静态分配和动态分配。
静态分配是编译器完成的,比如局部变量的分配。
动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
4.分配效率:
栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:
分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
堆则是C/C++函数库提供的,它的机制是很复杂的。
15.什么是键-值,键路径是什么
模型的性质是通过一个简单的键(通常是个字符串)来指定的。
视图和控制器通过键来查找相应的属性值。
在一个给定的实体中,同一个属性的所有值具有相同的数据类型。
键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。
第一个键的
性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。
键路径使您可以以独立于模型
实现的方式指定相关对象的性质。
通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相
关对象的特定属性。
16.c和obj-c如何混用
1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-c,c,c++代码,
但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj-c的代码,因为cpp只是cpp。
2)在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
3)在cpp中混用obj-c其实就是使用obj-c编写的模块是我们想要的。
如果模块以类实现,那么要按照cppclass的标准写类的定义,头文件中不能出现obj-c的东西,包括#importcocoa的。
实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。
如果模块以函数实现,那么头文件要按c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。
总结:
只要cpp文件和cppinclude的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,
而不能直接使用实现代码,实际上cpp混用的是obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。
obj-c的编译器支持cpp.
17.cocoatouch框架
iPhoneOS应用程序的基础CocoaTouch框架重用了许多Mac系统的成熟模式,但是它更多地专注于触摸的接口和优化。
UIKit为您提供了在iPhoneOS上实现图形,事件驱动程序的基本工具,其建立在和MacOSX中一样的Foundation框架上,
包括文件处理,网络,字符串操作等。
CocoaTouch具有和iPhone用户接口一致的特殊设计。
有了UIKit,您可以使用iPhoneOS上的独特的图形接口控件,按钮,
以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架除了UIKit外,CocoaTouch包含了创建世界一流iPhone应用程序需要的所有框架,从三维图形,到专业音效,
甚至提供设备访问API以控制摄像头,或通过GPS获知当前位置。
CocoaTouch既包含只需要几行代码就可以完成全部任务的强大的Objective-C框架,也在需要时提供基础的C语言API来直接访问系统。
这些框架包括:
CoreAnimation:
通过CoreAnimation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
CoreAudio:
CoreAudio是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。
CoreData:
提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用或大或小的数据模型。
功能列表:
框架分类
下面是CocoaTouch中一小部分可用的框架:
音频和视频:
CoreAudio,OpenAL,MediaLibrary,AVFoundation
数据管理:
CoreData,SQLite
图形和动画:
CoreAnimation,OpenGLES,Quartz2D
网络:
Bonjour,WebKit,BSDSockets
用户应用:
AddressBook,CoreLocation,MapKit,StoreKit
18.自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。
它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。
当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
1.ojc-c是通过一种"
referringcounting"
(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为一,
以后每当碰到有copy,retain的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数就会减一,如果此
对象的计数变为了0,就会被系统销毁.
2.NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.
3.autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
19.objc优点:
1)Cateogies
2)Posing
3)动态识别
4)指标计算
5)弹性讯息传递
6)不是一个过度复杂的C衍生语言
7)Objective-C与C++可混合编程
objc缺点:
1)不支援命名空間
2)不支持运算符重载
3)不支持多重继承
4)使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。
(如内联函数等),性能低劣。
20.sprintf,strcpy,memcpy使用上有什么要注意的地方
strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char*dst,constchar*src);
将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'
\0'
,由于拷贝的长度不是由我们自己控制的,
所以这个字符串拷贝很容易出错。
具备字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数,它的函数原型
为memcpy(char*dst,constchar*src,unsignedintlen);
将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。
但是会有内存叠加的问题。
sprintf是格式化函数。
将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。
sprintf格式化的函数的长度不可控,
有可能格式化后的字符串会超出缓冲区的大小,造成溢出。
21.用变量a给出下面的定义
a)一个整型数(Aninteger)
b)一个指向整型数的指针(Apointertoaninteger)
c)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoanintege)r
d)一个有10个整型数的数组(Anarrayof10integers)
e)一个有10个指针的数组,该指针是指向一个整型数的。
(Anarrayof10pointerstointegers)
f)一个指向有10个整型数数组的指针(Apointertoanarrayof10integers)
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargument
andreturnsaninteger)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anarrayoftenpointerstofunctionst
hattakeanintegerargumentandreturnaninteger)
答案是:
a)inta;
//Aninteger
b)int*a;
//Apointertoaninteger
c)int**a;
//Apointertoapointertoaninteger
d)inta[10];
//Anarrayof10integers
e)int*a[10];
//Anarrayof10pointerstointegers
f)int(*a)[10];
//Apoin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- iOS 试题