IOS面试题

【1】浅复制和深复制的区别?浅拷贝和深拷贝
答案:

(1)浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。通过对象的指针来访问这个对象
(2)深层复制(mutableCopy):复制引用对象本身
意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。当修改A时,A copy不变。打个比喻:1、浅拷贝就是:你挂了,你妈妈喊你回家吃饭时找不到人了,她很伤心。2、深拷贝就是:你克隆了一个你自己:你挂了、你兄弟还在,你妈妈喊你回家吃饭时能找到人。所以、孩子,安全起见、深拷贝吧,记得内存管理就是了。


【2】类别的作用?继承和类别在实现中有何区别?
答案:category可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。// category:类、种类
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。//类别跟类的优先级
类别主要有3个作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
 继承可以增加,修改或者删除方法,并且可以增加属性。
非正式协议:是使用类别category来实现,非正式协议是NSObject的一个类别,这样任何类的对象都可以作为委托对象来使用,它可以列出对象能够执行的所有方法,这样用来实现委托,我们可以使用选择器来判断该非正式协议中是否有这个方法。
正式协议:是一个命名的方法列表,与非正式协议相比不同的是,它要求显示的采用协议,采用协议的方法是在类的@interface声明中列出协议的名称,此时,实现协议的类应该遵守协议,承诺实现协议中的所有方法。

【3】 类别和类扩展的区别。
 答案:category和extensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。
extensions可以认为是一个私有的Category。
【4】oc中的协议和java中的接口概念有何不同?
答案:OC中的代理有2层含义,官方定义为 formal和informalprotocol。前者和Java接口一样。
informalprotocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。
其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里
“非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。
这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。
这么看,总觉得类别这玩意儿有点像协议的可选协议。"
现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,
现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。
【5】什么是KVO和 KVC?
答案:kvc:键 -值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。//KVC运用了一个isa-swizzling技术。isa-swizzling就是类型混合指针机制。KVC主要通过isa-swizzling,来实现其内部查找定位的。isa指针,就是is a kindof的意思,指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针,和其它数据。 

kvo(Key-Value Observing):键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
用过的一个地方是对于按钮点击变化状态的的监控。
比如我自定义的一个button。

当属性改变时KVO回提供自动的消息通知。每次属性改变了就会发送消息通知。这是因为当这个方案已经被明确定义,获得框架级支持,可以方便的采用,开法人员不需要设计自己的观察这模型,可以直接在工程里使用。KOV的架构可以支持多个观察者观察同一个属性,以及相关值。
[cpp] 
[self addObserver:self forKeyPath:@"highlighted" options:0context:nil]; 
#pragma mark KVO 
- (void)observeValueForKeyPath:(NSString *)keyPathofObject:(id)object change:(NSDictionary *)change context:(void*)context 

   if ([keyPath isEqualToString:@"highlighted"] ){ 
       [self setNeedsDisplay]; 
   } 

对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。
对于kvc机制如何通过key寻找到value:
“当通过KVC调用对象时,比如:[selfvalueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有someKey这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id)valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。
(cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)
 设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“
来至cocoa,这个说法应该挺有道理。
因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,
可以按照kvc查找的逻辑理解,就说的过去了。
【6.】代理的作用?
答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。

【7.】oc中可修改和不可以修改类型。
答案:就是可动态添加修改和不可动态添加修改一样。
比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。
【8.】我们说的oc是动态运行时语言是什么意思?
答案:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。
这个问题其实浅涉及到两个概念,运行时和多态。
运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。
——都用有一个相同的方法,不同的对象以自己的方式响应了相同的消息.因此也可以说,运行时机制是多态的基础
【9.】通知和协议的不同之处?
答案:协议有控制链(has-a)的关系,通知没有。//通知:它可以一对多,一条消息可以发送给多个消息接受者,但是不会处理消息
控制链:单一拥有和可控制的对应关系。
【10.】关于多态性
答案:多态,子类指针可以赋值给父类。
对象不仅仅可以已本身的类型存在,也可以作为其父类类型存在。多态性是允许将父对象设置成为和一个或多个它的子对象相等的技术, 多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作.

【11.】说说响应链
答案:事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。
【12.】 frame和bounds有什么不同?
答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)//frame:框架、结构
bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)//bounds:界限
【14.】 NSOperation队列
操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。
网上部分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。
这边又有个疑点是,对于队列来说,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,
但是Bfunc是等Afunc完全操作完以后,B才开始启动并且执行,因此队列的概念离乱上有点违背了多线程处理这个概念。
但是转念一想其实可以参考银行的取票和叫号系统。
因此对于A比B先排队取票但是B率先执行完操作,我们亦然可以感性认为这还是一个队列。
但是后来看到一票关于这操作队列话题的文章,其中有一句提到
“因为两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的。”
瞬间觉得这个queue名字有点忽悠人了,还不如pool~
综合一点,我们知道他可以比较大的用处在于可以帮组多线程编程就好了。
【15.】是否在一个视图控制器中嵌入两个tableview控制器?
答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,
只能说可以嵌入一个tableview视图。而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController

【16.】一个tableView是否可以关联两个不同的数据源?你会怎么处理?
答案:首先从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。    
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
   if(indexPath.section == 0)
  {
   }
   if(indexPath.section == 1)
  {
   }
}
【17.】 什么是id类型
id类型的变量可以存放任何数据类型的对象。在内部处理上,这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针。
例如:id number
将number声明为id类型的变量。可声明的方法使其具有id类型的返回值,如下:
-(id)newObject;(int)type;
这个程序声明了一个名为newObject的实例方法,它具有名为type的单个整型参数并有id类型的返回值。应该注意的是,对返回值和参数类型声明来说,id是默认的类型。
id类型是objetive-c中非常中药店额数据类型,它是多态和动态绑定的基础。

【18】obj-c有多重继承么?不是的话有什么替代方法?
cocoa中所有的类都是NSObject的子类
多继承在这里是用protocol委托代理来实现的
你不用去考虑繁琐的多继承,虚基类的概念.
 ood的多态特性  在obj-c中通过委托来实现.

【19】obj-c有私有方法么?私有变量呢
 objective-c -类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法
@interface Controller : NSObject { NSString *something; }
+ (void)thisIsAStaticMethod;
- (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) -
(void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的。

【20】 关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有externc的作用
const意味着"只读",下面的声明都是什么意思?
 const int a;
 int const a;
 const int *a;
 int * const a;
 int const * a const;
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

结论:
;关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果
 你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)
 ; 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
 ; 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。 
(1)欲阻止一个变量被改变,可以使用 const 关键字。在定义该 const 变量时,通常需要对它进行初
 始化,因为以后就没有机会再去改变它了;
 (2)对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指
 定为 const;
 (3)在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
 (4)对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量;
 (5)对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。

【21】关键字volatile有什么含意?并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1.并行设备的硬件寄存器(如:状态寄存器)

2.一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3.多线程应用中被几个任务共享的变量
【22一个参数既可以是const还可以是volatile吗?解释为什么。 一个指针可以是volatile 吗?解释为什么。
答案:

(1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

(2)是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
【23】static关键字的作用:
(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,
 因此其值在下次调用时仍维持上次的值;
 (2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
 (3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明
 它的模块内;
 (4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
 (5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。

【24】extern "C"的作用
(1)被 extern"C"限定的函数或变量是 extern 类型的;
      extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,
 其声明的函数和变量可以在本模块或其它模块中使用。
(2)被 extern"C"修饰的变量和函数是按照 C语言方式编译和连接的;

extern "C"的惯用法
(1)在 C++中引用 C语言中的函数和变量,在包含 C语言头文件(假设为 cExample.h)时,需进
 行下列处理:
 extern "C"
 {  #include "cExample.h"  }
 而在 C 语言的头文件中,对其外部函数只能指定为 extern 类型,C 语言中不支持extern"C"声明,
 在.c 文件中包含了 extern"C"时会出现编译语法错误。
(2)在 C 中引用C++语言中的函数和变量时,C++的头文件需添加 extern "C",但是在 C 语言中不能直接引用声明了 extern "C"的该头文件,应该仅将 C 文件中将 C++中定义的 extern"C"函数声明为extern类型。

【25】为什么标准头文件都有类似以下的结构?
   #ifndef __INCvxWorksh
    #define__INCvxWorksh
    #ifdef__cplusplus
    extern "C"{
    #endif
   
    #ifdef__cplusplus
    }
    #endif
   #endif
显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用
 是防止该头文件被重复引用。

【26】#import跟#include的区别,@class呢?
 @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在.m文件中还是需要使用#import
而#import比起#include的好处就是不会引起交叉编译

【27】MVC模式的理解
MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象代表特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制器对象是应用程序的视图对象和模型对象之间的协调者。

【28】线程与进程的区别和联系?
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

【29】列举几种进程的同步机制,并比较其优缺点。
答案:  原子操作 信号量机制   自旋锁   管程,会合,分布式系统
 进程之间通信的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础
 进程死锁的原因
答案:资源竞争及进程推进顺序非法
 死锁的4个必要条件
答案:互斥、请求保持、不可剥夺、环路
 死锁的处理
答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁

【30】堆和栈的区别
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
申请大小:
 栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在Windows下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出

分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。

【31】什么是键-值,键路径是什么
模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。第一个键的性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。键路径使您可以以独立于模型实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性。

【32】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的标准写类的定义,头文件中不能出现oc的东西,包括#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.

【33】目标-动作机制
目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)
 的形式保有其动作消息的目标。
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。
程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。

【34】cocoa touch框架
iPhoneOS应用程序的基础Cocoa Touch 框架重用了许多Mac系统的成熟模式,但是它更多地专注于触摸的接口和优化。UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的基本工具,其建立在和Mac OS X 中一样的Foundation框架上,包括文件处理,网络,字符串操作等。
Cocoa Touch具有和 iPhone 用户接口一致的特殊设计。有了UIKit,您可以使用iPhone OS 上的独特的图形接口控件,按钮,以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形,到专业音效,甚至提供设备访问API 以控制摄像头,或通过GPS 获知当前位置。Cocoa Touch既包含只需要几行代码就可以完成全部任务的强大的Objective-C 框架,也在需要时提供基础的 C 语言API 来直接访问系统。这些框架包括:
Core Animation
通过 CoreAnimation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio
Core Audio是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。
CoreData
提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用或大或小的数据模型。

【35】功能列表:框架分类
下面是 CocoaTouch 中一小部分可用的框架:
音频和视频:

1_Core Audio  2_OpenAL 3_MediaLibrary 4_AV Foundation
数据管理:1_Core Data 2_SQLite
图形和动画:1_Core Animation 2_OpenGL ES 3_Quartz2D
网络:1_Bonjour2_WebKit 3_BSD Sockets
用户应用:
1_Address Book 2_Core Location 3_Map Kit 4_StoreKit

【36】objc的内存管理
 如果您通过分配和初始化(比如[[MyClass alloc]init])的方式来创建对象,您就拥有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利方法new 时也同样适用。
如果您拷贝一个对象,您也拥有拷贝得到的对象,需要负责该对象的释放。
如果您保持一个对象,您就部分拥有这个对象,需要在不再使用时释放该对象。反过来,
如果您从其它对象那里接收到一个对象,则您不拥有该对象,也不应该释放它(这个规则有少数的例外,在参考文档中有显式的说明)。

1.ojc-c是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
 2. NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.
 3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.

自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

【37】类工厂方法是什么
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并进行自动释放处理。这些方法的形式是+ (type)className...(其中 className不包括任何前缀)。工厂方法可能不仅仅为了方便使用。它们不但可以将分配和初始化合在一起,还可以为初始化过程提供对象的分配信息。类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例。虽然init...方法可以确认一个类在每次程序运行过程只存在一个实例,但它需要首先分配一个“生的”实例,然后还必须释放该实例。工厂方法则可以避免为可能没有用的对象盲目分配内存。

【38】单件实例是什么
Foundation和 ApplicationKit 框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManager 和NSWorkspace类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。单件对象充当控制中心的角色,负责指引或协调类的各种服务。如果类在概念上只有一个实例(比如NSWorkspace),就应该产生一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可以使用单件实例机制,而不是工厂方法或函数。

【39】动态绑定
—在运行时确定要调用的方法
动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时,特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而透明地发生。

【40】obj-c的优缺点
objc优点:1) Cateogies 2)Posing 3) 动态识别 4)指标计算 5)弹性讯息传递6) 不是一个过度复杂的 C 衍生语言

7) Objective-C 与C++ 可混合编程
 缺点:1) 不支援命名空间 2)  不支持运算符重载 3) 不支持多重继承 4)使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。

【41】sprintf,strcpy,memcpy使用上有什么要注意的地方
strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, const char*src);
将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。具备字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(char *dst, const char* src, unsigned intlen);
将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。
sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。

【42】用变量a给出下面的定义 
a)一个整型数(Aninteger) 
 b)一个指向整型数的指针( A pointer to an integer) 
 c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to anintege)r 
 d)一个有10个整型数的数组( Anarray of 10 integers) 
 e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers) 
 f) 一个指向有10个整型数数组的指针( Apointer to an array of 10 integers) 
 g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointer to a function that takes an integer as anargument  and returns aninteger) 
 h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functionst
 hat take an integer argument and return aninteger ) 
答案是: 
 a) int a; // An integer 
 b) int *a; // A pointer to aninteger 
 c) int **a; // A pointer to a pointer to aninteger 
 d) int a[10]; // An array of 10integers 
 e) int *a[10]; // An array of 10 pointers tointegers 
 f) int (*a)[10]; // A pointer to an array of 10integers 
 g) int (*a)(int); // A pointer to a function athat  takes an integer argument and returns aninteger 
 h) int (*a[10])(int); // An array of 10 pointersto functions  that take an integer argument andreturn an integer

你可能感兴趣的:(iOS面试题)