iOS常见基本问题整理 (II)

来源:互联网 发布:网络诈骗了2000要判刑 编辑:程序博客网 时间:2024/06/07 21:16

1.怎么理解MVC,在Cocoa中MVC是怎么实现的?

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

2.__block和__weak修饰符的区别

1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。 

2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。 

3.__block对象可以在block中被重新赋值,__weak不可以。 

3.delegate与notification的区别 

1、二者都用于传递消息,不同之处主要在于一个是一对一的,另一个是一对多的。

2、notification通过维护一个array,实现一对多消息的转发。

3、delegate需要两者之间必须建立联系,并且reciever可以返回值给sender;notification不需要两者之间有联系,reciever无法返回值给sender。delegate用于sender希望接受到reciever的某个功能反馈值,notification用于通知多个object某个事件。

4.理解KVC(NSKeyValueCoding)与KVO(Key-Value-Observing)(键-值-编码与键-值-监看)

KVC是NSKeyValueCoding的缩写,是一个非正式的Protocol。是一种可以直接通过字符串的名字(key)来访问类属性的机制,而不是通过调用的Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。

KVO是NSKeyValue Observe的缩写,中文是键值观察。这是一个典型的观察者模式,观察者在键值改变时会得到通知。iOS中有个Notification的机制,也可以获得通知,但这个机制需要有个Center,相比之下KVO更加简洁而直接。

5.id、nil代表什么?

id:id和void *并非完全一样。id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id是一个指针,所以你在使用id的时候不需要加星号。比如id foo=nil定义了一个nil指针,这个指针指向NSObject的一个任意子类。而id *foo=nil则定义了一个指针,这个指针指向另一个指针,被指向的这个指针指向NSObject的一个子类。

nil:nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。

6.sprintf,strcpy,memcpy使用上有什么要注意的地方 

strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, const char *src); 将 src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。

memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(void *dest, const void *src, size_t len); 将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。 

sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。 

7.自动释放池是什么,如何工作 

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

1.  ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁. 

2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的. 

3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一. 

8.类别的作用

类别主要有3个作用:

(1)将类的实现分散到多个不同文件或多个不同框架中。

(2)创建对私有方法的前向引用。

(3)向对象添加非正式协议。

类别的局限性,有两方面局限性:

(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。

(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

无法添加实例变量的局限可以使用字典对象解决



0 0