您的位置:首页 > 职场人生

面试题的一些总结(1)

2016-04-18 19:29 211 查看
8#include #import
的区别、#import @class 的区别 
答:#include 和#import 其效果相同,都是查询类中定义的行为(方法)。只 是后者不会引起交叉编译,确保头文件只会被导入一次。@class 的表明,只定义了类的名称,而具体类的行为是不知道的,一般用于.h 文件,因此,@class 比#import 编译效率更高。此外@class 和#import 的主要区别在于解决引用死锁 的问题。 
9@public@protected@private
它们的含义与作用 
( 1) @public: 答:对象的实例变量的作用域在任意地方都可以被访问 
( 2) @protected: 答:对象的实例变量作用域在本类和子类都可以被访问 
( 3) @private: 答:实例变量的作用域只能在本类(自身)中访问 
(4)通过指针运算符(->)能够访问到 private
方法吗?OC 语言中还提供 了哪些方式能直接和间接的访问对象的实例变量? 
答:不可以,可以通过合成存取器访问实例变量,也可自己定义 setter 和 getter 方法访问实例变量,KVC(key value coding)——键值编码,间接的方式访问实 例变量。

11、简述内存管理基本原则 
答:(1)如果使用alloc、copy(mutableCopy)或者 retian 一个对象时,你就 有义务,向它发送一条 release 或者autorelease 消息。其他方法创建的对象,不 需要由你来管理内存。 
(2)向一个对象发送一条 autorelease 消息,这个对象并不会立即销毁,而是将这个对象放入了自动释放池,待池子释放时,它会向池中每一个对象发送 一条 release 消息,以此来释放对象。 
(3)向一个对象发送 release 消息,并不意味着这个对象被销毁了,而是 当这个对象的引用计数为 0 时,系统才会调用 dealloc 方法,释放该对象和对象 本身它所拥有的实例。

17、堆和栈的区别 
答:(1)栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值,局部变量的值等。先进后出。 
(2)堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收。 
(3)全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。 
(4)文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。 (5)程序代码区—存放函数体的二进制代码。 

20、定义属性时,什么时候用 assignretaincopy
以及它们的之间的区别 
答:(1)assign:普通赋值,一般常用于基本数据类型,常见委托设计模式,以此来防止循环引用。(我们称之为弱引用,weak) 
(2)retain:保留计数,获得到了对象的所有权。引用计数在原有基础上 加1。 
(3)copy:一般认为,是在内存中重新开辟了一个新的内存空间,用来 
存储新的对象,和原来的对象是两个不同的地址,引用计数分别 1。但是当 copy 对象为不可变对象时,那么 copy 的作用相当于 retain。因为,这样可以节约内 存空间。

21、解释以下关键字,staticselfsuper用实例说明 
答static: 静态全局变量,持久性作用、存储区域在静态区域,它的生命周期 和应用进行绑定。程序结束时,由系统自动回收。 
self:当前消息的接收者。 super:向父类发送消息。

32、什么是谓词?

答:cocoa 中提供了一个 NSPredicate 的类,该类主要用于指定过滤器的条件, 
每一个对象通过谓词进行筛选,判断条件是否匹配。

34、在 objective c 中如何实现KVO 
答:(1)注册观察者(这里我们需要注意,观察者和被观察者不会被保留也不 会被释放) 
- (void)addObserver:(NSObject *)observerforKeyPath:(NSString *)keyPath 
options:(NSKeyValueObservingOptions)options 
context:(void *)context; 
(2)接收变更通知

- (void)observeValueForKeyPath:(NSString*)keyPath 
ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context; 
(3)移除对象的观察者身份

-(void)removeObserver:(NSObject *)observer 
forKeyPath:(NSString *)keyPath; 

42isMemberOfClassisKindOfClass联系与区别 
答:两者都能检测一个对象是否是某个类的成员, 两者之间的区别是: 
isKindOfClass 不但可以用来确定一个对象是否是一个类的成员,也可以用来确 定一个对象是否是派生自该类的类的成员 ,而 isMemberOfClass 做不到后一点。 
如 ClassA 派 生 自 NSObject 类 , ClassA *a = [ClassA alloc] init]; [aisKindOfClass:[NSObject class]] 可以检查出a 是否是 NSObject 派生类的成员,但 isMemberOfClass 做不到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: