1、iOS 面试题锦集 1.Difference between shallow copy and deep copy? 浅复制和深复制的区分? 答案:浅层复制:只复制指向对象的指针,而不复制引用对象自身。 深层复制:复制引用对象自身。 意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象自身资源 还是只有一份,那假如我们对A_copy执行了修改操作,那么发觉A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好了解了,内存中存在了 两份独立对象自身。 用网上一哥们通俗的话将就是: 浅
2、复制好比你和你的影子,你完蛋,你的影子也完蛋 深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。 2.What is advantage of categories? What is difference between implementing a category and inheritance? 类别的作用?继承和类别在实现中有何区分? 答案:category 能够在不得悉,不变化本来代码的情况下往里面添加新的措施,只能添加,不能删除修改。 并且假如类别和本来类中的措施产生名称冲突,则类别将覆盖本来的措施,因为类别具备更高的优先级。 类别重要有3个作用: (1)将类的实现分散到
3、多个不一样文献或多个不一样框架中。 (2)创建对私有措施的前向引用。 (3)向对象添加非正式协议。 继承能够增加,修改或者删除措施,并且能够增加属性。 3.Difference between categories and extensions? 类别和类扩展的区分。 答案:category和extensions的不一样在于 后者能够添加属性。另外后者添加的措施是必须要实现的。 extensions能够以为是一个私有的Category。 4.Difference between protocol in objective c and interfaces in java? ob
4、c中的协议和java中的接口概念有何不一样? 答案:OBC中的代理有2层含义,官方定义为 formal和informal protocol。前者和Java接口同样。 informal protocol中的措施属于设计模式考虑范围,不是必须实现的,不过假如有实现,就会变化类的属性。 其实有关正式协议,类别和非正式协议我很早前学习的时候大体看过,也写在了学习教程里 “非正式协议概念其实就是类别的另一个体现方式“这里有某些你也许希望实现的措施,你能够使用他们愈加好的完成工作”。 这个意思是,这些是可选的。例如我门要一个愈加好的措施,我们就会申明一个这么的类别去实现。然后你在后期能够直接使用这些愈
5、加好的措施。 这么看,总以为类别这玩意儿有点像协议的可选协议。" 目前来看,其实protocal已经开始对二者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“, 目前我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。 5.What are KVO and KVC? 答案:kvc:键 - 值编码是一个间接访问对象的属性使用字符串来标识属性,而不是通过调用存取措施,直接或通过实例变量访问的机制。 诸多情况下能够简化程序代码。apple文档其实给了一个很好的例子。 kvo:键值观测机制,他提供了观测某一属性变化的措施,极大
6、的简化了代码。 详细用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。 例如我自定义的一个button [cpp] [self addObserver:self forKeyPath:@"highlighted" options:0 context:nil]; #pragma mark KVO - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([k
7、eyPath isEqualToString:@"highlighted"] ) { [self setNeedsDisplay]; } } 对于系统是依照keypath去取的到对应的值发生变化,理论上来说是和kvc机制的道理是同样的。 对于kvc机制怎样通过key寻找到value: “当通过KVC调用对象时,例如:[self valueForKey:@”someKey”]时,程序会自动试图通过几个不一样的方式解析这个调用。首先查找对象是否带有 someKey 这个措施,假如没找到,会继续查找对象是否带有someKey这个实例变量(iVar),假如还没有找到,
8、程序会继续试图调用 -(id) valueForUndefinedKey:这个措施。假如这个措施还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。 (注:Key-Value Coding查找措施的时候,不但仅会查找someKey这个措施,还会查找getsomeKey这个措施,前面加一个get,或者_someKey以及_getsomeKey这几个形式。同时,查找实例变量的时候也会不但仅查找someKey这个变量,也会查找_someKey这个变量是否存在。) 设计valueForUndefinedKey:措施的重要目标是当你使用-(id)valueF
9、orKey措施从对象中祈求值时,对象能够在错误发生前,有最后的机会响应这个祈求。这么做有诸多好处,下面的两个例子阐明了这么做的好处。“ 来至cocoa,这个说法应当挺有道理。 因为我们懂得button却是存在一个highlighted实例变量.因此为何上面我们只是add一个有关的keypath就行了, 能够按照kvc查找的逻辑了解,就说的过去了。 6.What is purpose of delegates? 代理的作用? 答案:代理的目标是变化或传递控制链。允许一个类在某些特定期刻通知到其他类,而不需要获取到那些类的指针。能够减少框架复杂度。 另外一点,代理能够了解为java中的回调
10、监听机制的一个类似。 7.What are mutable and immutable types in Objective C? obc中可修改和不能够修改类型。 答案:可修改不可修改的集合类。这个我个人简单了解就是可动态添加修改和不可动态添加修改同样。 例如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者能够添加等,能够动态申请新的内存空间。 8.When we call objective c is runtime language what does it mean? 我们说的obc是动态运行时语言是什么意思? 答案:多态
11、 重要是将数据类型确实定由编译时,推迟到了运行时。 这个问题其实浅包括到两个概念,运行时和多态。 简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定措施。 多态:不一样对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的措施-eat; 那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,不过调用是我们只需调用各自的eat措施。 也就是不一样的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。 因此也能够说,运行时机制是多态的基础?~~~ 9.what is difference betwe
12、en NSNotification and protocol? 通知和协议的不一样之处? 答案:协议有控制链(has-a)的关系,通知没有。 首先我一开始也不太明白,什么叫控制链(专业术语了~)。不过简单分析下通知和代理的行为模式,我们大体能够有自己的了解 简单来说,通知的话,它能够一对多,一条消息能够发送给多个消息接收者。 代理按我们的了解,到不是直接说不能一对多,例如我们懂得的明星经济代理人,诸多时候一个经济人负责好几个明星的事务。 只是对于不一样明星间,代理的事物对象都是不一样样的,一一对应,不也许阐明天要处理A明星要一个公布会,代理人发出处剪公布会的消息后,别称B的 公布会了。不过
13、通知就不一样样,他只关心发出通知,而不关心多少接收到感兴趣要处理。 因此控制链(has-a从英语单词大体能够看出,单一拥有和可控制的对应关系。 10.What is push notification? 什么是推送消息? 11.Polymorphism? 有关多态性 答案:多态,子类指针能够赋值给父类。 这个题目其实能够出到一切面对对象语言中, 因此有关多态,继承和封装基本最佳都有个自我意识的了解,也并非一定要把书上资料上写的能背出来。 最重要的是转化成自我了解。 12.Singleton? 对于单例的了解 答案:11,12题目其实出的有点泛泛的感觉了,也许说是编程语言需要
14、或是必备的基础。 基本能用熟悉的语言写出一个单例,以及能够利用到的场景或是你编程中遇到过利用的此种模式的框架类等。 深入点,考虑下怎样在多线程访问单例时的安全性。 13.What is responder chain? 说说响应链 答案: 事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传输。 能够说点事件的分发,传递以及处理。详细能够去看下touch事件这块。因为问的太抽象化了 严重怀疑题目出到越背面就越笼统。 14.Difference between frame and bounds? frame和bounds有什么不一样? 答案:frame指的
15、是:该view在父view坐标系统中的位置和大小。(参考点是爸爸的坐标系统) bounds指的是:该view在自身坐标系统中 的位置和大小。(参考点是自身坐标系统) 15.Difference between method and selector? 措施和选择器有何不一样? 答案:selector是一个措施的名字,method是一个组合体,包括了名字和实现. 详情能够看apple文档。 16.Is there any garbage collection mechanism in Objective C.? OBC的垃圾回收机制? 答案: OBC2.0有Garbage c
16、ollection,不过iOS平台不提供。 一般我们了解的objective-c对于内存管理都是手动操作的,不过也有自动释放池。 不过差了大部分资料,貌似不要和arc机制搞混就好了。 求更多~~ 17.NSOperation queue? 答案:存储NSOperation的集合类。 操作和操作队列,基本能够当作java中的线程和线程池的概念。用于处理ios多线程开发的问题。 网上部分资料提到一点是,虽然是queue,不过却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。 这边又有个疑点是,对于队列来说,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc
17、先执行这个是必然的, 不过Bfunc是等Afunc完全操作完以后,B才开始开启并且执行,因此队列的概念离乱上有点违背了多线程处理这个概念。 不过转念一想其实能够参考银行的取票和叫号系统。 因此对于A比B先排队取票不过B率先执行完操作,我们亦然能够感性以为这还是一个队列。 不过日后看到一票有关这操作队列话题的文章,其中有一句提到 “因为两个操作提交的时间间隔很近,线程池中的线程,谁先开启是不定的。” 瞬间以为这个queue名字有点忽悠人了,还不如pool~ 综合一点,我们懂得他能够比较大的用处在于能够帮组多线程编程就好了。 18.What is lazy loading? 答案:懒汉模式,
18、只在用到的时候才去初始化。 也能够了解成延时加载。 我以为最佳也最简单的一个列子就是tableView中图片的加载显示了。 一个延时载,防止内存过高,一个异步加载,防止线程堵塞。 19.Can we use two tableview controllers on one viewcontroller? 是否在一个视图控制器中嵌入两个tableview控制器? 答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧, 只能说能够嵌入一个tableview视图。当然,题目自身也有歧义,假如不是我们定性思维以为的UIViewController
19、 而是宏观的表示视图控制者,那我们倒是能够把其当作一个视图控制者,它能够控制多个视图控制器,例如TabbarController 那样的感觉。 20.Can we use one tableview with two different datasources? How you will achieve this? 一个tableView是否能够关联两个不一样的数据源?你会怎么处理? 答案:首先我们从代码来看,数据源怎样关联上的,其实是在数据源关联的代理措施里实现的。 因此我们并不关心怎样去关联他,他怎么关联上,措施只是让我返回依照自己的需要去设置如有关的数据源。 因此,我以为能够设置
20、多个数据源啊,不过有个问题是,你这是想干嘛呢?想让列表怎样显示,不一样的数据源分区块显示? 21.Object-c的类能够多重继承么?能够实现多个接口么?重写一个类的方式用继承好还是分类好?为何? Objective-c只支持单继承,假如要实现多继承的话,能够通过类别和协议的方式来实现,cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理 来实现的。 22.#import 跟#include 又什么区分 #import<> 跟 #import""又什么区分? 答案:@class一般用于头文献中需要申明该类的某个实例变量的时候用到,在m文 件中还
21、是需要使用#import而#import比起#include的好处就是不会引起交叉编译。 如下没标准答案 23.类变量的@protected ,@private,@public,@package申明各有什么含义?() 24.id 申明的对象有什么特性? 答案:id是个很重要的类型,是个能够指向任何类型的指针或者能够了解为指向任何未知类型的指针。 25.MVC是什么?有什么特性?为何在iPhone上被广泛利用? 答案:MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象代表 尤其的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象懂得怎样显
22、示应用程序的模型数据,并且也许允许用户对其进行编辑。控制 器对象是应用程序的视图对象和模型对象之间的协调者。 26.对于语句NSString* testObject = [[NSData alloc] init];testObject 在编译时和运行时分别是什么类型的对象? 27.什么是安全释放? 28.为何有些4.0独有的objective-c 函数在3.1上运行时会报错.而4.0独有的类在3.1上分派内存时不会报错?分派的成果是什么? 29.为何4.0独有的c函数在3.1的机器上运行不会报错(在没有调用的情况下?)而4.0独有的类名在3.1的机器上一运行就报错? 30
23、异常exception 怎么捕捉?不一样的CPU结构上开销怎样?C中又什么类似的措施? 31.property中属性retain,copy,assgin的含义分别是什么?有什么区分?将其转换成get/set措施怎么做?有什么注意事项? 32.委托是什么?委托的property申明用什么属性?为何? 33.浅拷贝和深拷贝区分是什么?... 34.Cocoa中有虚基类的概念么?怎么简洁的实现? 35.自动释放池跟GC(垃圾回收)有什么区分?iPhone上有GC么?[pool release] 和[pool drain]有什么区分? iPhone上没有GC。iPhone开发的时候没有垃
24、圾回收机制。 在垃圾回收环境中,release是一个空操作。因此,NSAutoreleasePool提供了drain措施,在引用计数环境中,该措施的作用等同于调用release,但在垃圾回收环境中,它会触发垃圾回收(假如自上次垃圾回收以来分派的内存不小于目前的阈值)。因此,在一般情况下,您应当使用drain而不是release来销毁自动释放池。 36. for(int index = 0; index < 20; index ++){ NSString *tempStr = @”tempStr”; NSLog(tempStr); NSNumber *temp
25、Number = [NSNumber numberWithInt:2]; NSLog(tempNumber); } 这段代码有什么问题.?会不会导致内存泄露(多线程)?在内存担心的设备上做大循环时自动释放池是写在循环内好还是循环外好?为何? 37.内存管理的几条标准时什么?按照默认法则.那些核心字生成的对象需要手动释放?在和property结合的时候怎样有效的防止内存泄露? 38.在一个对象释放前.假如他被加到了notificationCenter 中.不在notificationcenter中remove这个对象也许会出现什么问题? 39.怎样实现一个 singleton
26、的类.给出思绪。 40.什么是序列化或者Acrchiving,能够用来做什么,怎样与copy结合,原理是什么?. 41. 线程与进程的区分和联系? 答案: 进程和线程都是由操作系统所体会的程序运行的基本 单元,系统利用该基本单元实现系统对应用的并发性。 程和线程的重要差异在于它们是不一样的操作系统资源 管理方式。进程有独立的地址空间,一个进程瓦解后,在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不一样执行途径。线程有自己的堆栈和局部变 量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健壮,但在进程切换时,花费资源较大,效率要
27、差一 些。但对于某些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。 42.在iphone上有两件事情要做,请问是在一个线程里按次序做效率高还是两个线程里做效率高?为何? 43.runloop是什么?在根本程中的某个函数里调用了异步函数,怎么样block目前线程,且还能响应目前线程的timer事件,touch事件等. 44.ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗? iOS中能够有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data;core data能够使你以图形界面的
28、方式迅速的定义app的数据模型,同时在你的代码中轻易获取到它。core data提供了基础结构去处理常用的功效,例如保存,恢复,撤消和重做,允许你在app中继续创建新的任务。在使用core data的时候,你不用安装额外的数据库系统,因为core data使用内置的sqlite数据库。core data将你app的模型层放入到一组定义在内存中的数据对象。core data会追踪这些对象的变化,同时能够依照需要做相反的变化,例如用户执行撤消命令。当core data在对你app数据的变化进行保存的时候,core data会把这些数据归档,并永久性保存。 mac os x中sqlite库,它是一
29、个轻量级功效强大的关系数据引擎,也很轻易嵌入到应用程序。能够在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与core data框架不一样的是,sqlite是使用程序式的,sql的重要的API来直接操作数据表。 Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Dta支持SQLite作为一个存储类型,但它不能使用任意的SQLite数据库。Core Data在使用的过程种自己创建这个数据库。Core Data支持对一、对多的关系。 45.论述一个nil对象从interface bulider产生,到载入程序运行空间,最后被释放时
30、所经历的生命周期. 46.notification是同时还是异步? kvo是同时还是异步?notification是全进程空间的通知吗?kvo呢? 47.kvc是什么?kvo是什么?有什么特性? 48.响应者链是什么? 49.unix上进程怎么通信? UNIX重要支持三种通信方式: 1. 基本通信:重要用来协调进程间的同时和互斥 (1)锁文献通信 通信的双方通过查找特定目录下特定类型的文献(称锁文献)来完成进程间 对临界资源访问时的互斥;例如进程p1访问一个临界资源,首先查看是否有一个特定类型文献,若有,则等候一段时间再查找锁文献。 (2
31、)统计锁文献 2. 管道通信:适应大批量的数据传递 3. IPC :适应大批量的数据传递 50.timer的间隔周期准吗?为何?怎样实现一个精准的timer? 51.UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗?(答案众多,不懂得哪个是正确~~) 模板(Template)模式,所有datasource和delegate接口都是模板模式的经典应用, 组合模式composition,所有的container view都用了这个模式 观测者模式observer,所有的UIResponder都用了这个模式。 52假如要开发一
32、个类似eclipse的软件,支持插件结构。且开放给第三方开发。你会怎样去设计它?(大约思绪) 53. main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); } 答:2,5 *(a+1)就是a[1],*(ptr-1)就是a[4],执行成果是2.5 ,&a+1不是首地址+1,系统会以为加一个a数组的偏 移,是偏移了一个数组的大小(本例是5个int,int *ptr=(int *)(&a+1); 则ptr实际 是&(a[5
33、]),也就是a+5 原因如下: &a是数组指针,其类型为 int (*)[5]; 而指针加1要依照指针类型加上一定的值,不一样类型的指针+1之后增加的大小不一样。a是长度为5的int数组指针,因此要加 5*sizeof(int)因此ptr实际是a[5],不过prt与(&a+1)类型是不一样样的(这点很重要),因此prt-1只会减去sizeof(int*),a,&a的地址是同样的,但意思不一样样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]. 54. 如下为Windows NT下的32位C+
34、程序,请计算sizeof的值 void Func ( char str[100] ) { sizeof( str ) = ? } void *p = malloc( 100 ); sizeof ( p ) = ? 答案:这题 很常见了,Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了自身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,能够作自增、自减等 操作,能够被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof ( p )
35、 都为4。 55. - (void)*getNSString(const NSString * inputString) { inputString = @"This is a main test\n"; return ;} -main(void) {NSString *a=@"Main"; NSString *aString = [NSString stringWithString:@"%@",getNSString(a)]; NSLog(@"%@\n", aString);} 最后问输出的字符串:NULL,output在 函数返回后,内存已经被释放。
36、56. 列举几个进程的同时机制,并比较其优缺陷。 答案: 原子操作 信号量机制 自旋锁 管程,会合,分布式系统 进程之间通信的途径 答案:共享存储系统消息传递系统管道:以文献系统为基础 进程死锁的原因 答案:资源竞争及进程推进次序非法 死锁的4个必要条 件 答案:互斥、祈求保持、不可剥夺、环路 死锁的处理 答案:鸵鸟方略、预防方略、防止方略、检测与解除死锁 57. 堆和栈的区分 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,轻易产生memory leak。 申请大小: 栈:在Windows下,
37、栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统 预先要求好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),假如申请的空间超出栈的剩余空间时,将提示 overflow。因此,能从栈取得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是因为系统是用链表来存储的空闲内存地 址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆取得的空间比较灵活,也比较大。 碎片问题:对于堆来讲,频繁的new/delete势必会导致内存空间的不连续,
38、从而导致大量的碎片,使程序效率减少。对于栈来讲,则不会存在这个 问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不也许有一个内存块从栈中间弹出 分派方式:堆都是动态分派的,没有静态分派的堆。栈有2种分派方式:静态分派和动态分派。静态分派是编译器完成的,例如局部变量的分派。动态分派由 alloca函数进行分派,不过栈的动态分派和堆是不一样的,他的动态分派是由编译器进行释放,无需我们手工实现。 分派效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分派专门的存储器存储栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的 效率比较高。堆则是C/C++函数库提供的,它的
39、机制是很复杂的。 58. 什么是键-值,键途径是什么? 模型的性质是通过一个简单的键(一般是个字符串)来指定的。视图和控制器通过键 来查找对应的属性值。在一个给定的实体中,同一个属性的所有值具备相同的数据类型。键-值编码技术用于进行这么的查找—它是一个间接访问对象属性的机制。 键途径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性 质序列。第一个键的 性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。键途径使您能够以独立于模型 实现的方式指定有关 对象的性质。通过键途径,您能够指定对象图中的一个任意深度的途径,使其指向相 关对象的特定属性。 59.
40、 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编写的模块是我们想要的。 假如模块以类实现,那么要按照cpp class的标准写类的定义,头文献中不能出现obj-c的东西,包括#import cocoa的。实现文献中,即类的实当代码中能够使
41、用obj-c的东西,能够import,只是后缀是mm。 假如模块以函数实现,那么头文献要按 c的格式申明函数,实现文献中,c++函数内部能够用obj-c,但后缀还是mm或m。 总结:只要cpp文献和cpp include的文献中不包括obj-c的东西就能够用了,cpp混用obj-c的核心是使用接口,而不能直接使用实当代码,实际上cpp混用的是 obj-c编译后的o文献,这个东西其实是无差异的,因此能够用。obj-c的编译器支持cpp. 60. 目标-动作机制 目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参 见"插座变量"部分) 的形式保有其动作消息的目标。
42、动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现 的措施。 程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。 61. cocoa touch框架 iPhone OS 应用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模式,不过它更多地专注于触摸的接口和优化。UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的基本工具,其建立在和 Mac OS X 中同样的 Foundation 框架上,包括文献处理,网络,字符串操作等。 Cocoa Touch 具备和 iPhone 用户接口一致的特殊设计。有了
43、UIKit,您能够使用 iPhone OS 上的独特的图形接口控件,按钮,以及全屏视图的功效,您还能够使用加速仪和多点触摸手势来控制您的应用。 各色俱全的框架 除了 UIKit 外,Cocoa Touch 包括了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形,到专业音效,甚至提供设备访问 API 以控制摄像头,或通过 GPS 获知目前位置。Cocoa Touch 既包括只需要几行代码就能够完成所有任务的强大的 Objective-C 框架,也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架包括: Core Animation 通过 Core Animatio
44、n,您就能够通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。 Core Audio Core Audio 是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功效。 Core Data 提供了一个面对对象的数据管理处理方案,它易于使用和了解,甚至可处理任何应用 或大或小的数据模型。 功效列表:框架分类 下面是 Cocoa Touch 中一小部分可用的框架: • 音频和视频 • Core Audio • OpenAL • Media Library • AV Foundation • 数据管理 • Core Data • SQLite
45、 • 图形和动画 • Core Animation • OpenGL ES • Quartz 2D • 网络/li> • Bonjour • WebKit • BSD Sockets • 用户应用 • Address Book • Core Location • Map Kit • Store Kit 62. objc的内存管理 假如您通过度派和初始化(例如[[MyClass alloc] init])的方式来创建对象,您就拥 有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利措施new 时也同样合用. 假如您拷贝一个对象,您也拥有拷贝得到的对
46、象,需要负责该对象的释放. 假如您保持一个对象,您就部分拥有这个对象,需要在不再使用时释放该对象。 假如您从其他对象那里接收到一个对象,则您不拥有该对象,也不应当释放它(这个规则有少数 的例外,在参考文档中有显式的阐明)。 63. 自动释放池是什么,怎样工作 当您向一个对象发送一个autorelease消息时,Cocoa就会将该对 象的一个引用放入到最新的自动释放池。它仍然是个合法的对象,因此自动释放池定义的作用域内的其他对象能够向它发送消息。当程序执行到作用域结束的位置 时,自动释放池就会被释放,池中的所有对象也就被释放。 1. ojc-c 是通过一个"referring co
47、unting"(引用计数)的方式来管理内存的, 对象在开始分派内存(alloc)的时候引用计数为一,以后每当遇到有copy,retain的时候引用计数都会加一, 每当遇到release和autorelease的时候引用计数就会减一,假如此对象的计数变为了0, 就会被系统销毁. 2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的. 3. autorelease和release没什么区分,只是引用计数减一的时机不一样而已,autorelease会在对象的使用真正结束的时候才做引用计数 减一. 64. 类工厂措施是什么 类工厂措施的实现是为了向客户
48、提供以便,它们将分派和初始化合在一个步骤中, 返回被创建的对象,并 进行自动释放处理。这些措施的形式是+ (type)className...(其中 className不包括任何前缀)。 工厂措施也许不但仅为了以便使用。它们不但能够将分派和初始化合在一起,还能够 为初始化过程提供对 象的分派信息。 类工厂措施的另一个目标是使类(例如NSWorkspace)提供单件实例。虽 然init...措施能够确认一 个类在每次程序运行过程只存在一个实例,但它需要首先分派一个“生的”实例,然后还必须释放该实例。 工厂 措施则能够防止为也许没有用的对象盲目分派内存。 65. 单件实例是什么 Found
49、ation 和 Application Kit 框架中的某些类只允许创建单件对象,即这些类在目前进程中的唯一实例。举例来说,NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。当向这些类祈求实例的时候,它们会向您传递单一实例的一个引用,假如该实例还不存在,则首先进行实例的分派 和初始化。 单件对象充当控制中心的角色,负责指引或协调类的各种服务。假如类在概念上只有一个实例(例如 NSWorkspace),就应当产生 一个单件实例,而不是多个实例;假如将来某一天也许有多个实例,您可 以使用单件实例机制,而不是工厂措施或函数。 66. 动态绑定—在运行时确定要调用的措施 动态绑定将调用措施确实定也推迟到运行时。在编译时,措施的调用并不和代码绑定 在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都能够得到不一样的成果。运行时因子负责确定消息的接 收者和被调用的措施。 运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点 确定被调用的措施,措施和消息是动态绑定的。并且,您无须在Objective-C 代码中做任何工作,就能够自动获取动态绑定的好处。您在每次发送消息时, 尤其
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818