IOS面试题(二)
1.浅复制和深复制的区别?
浅层复制:只复制指向对象的指针,即两个指针指向同一块内存地址。
深层复制:复制引用对象本身,即两个指针分别指向两块内存地址,复制后两块内存中存放的数据相同。
2.类别的作用?继承和类别在实现中有何区别?
类别主要有3个作用:
(1)把一个庞大的类划分为小块来进行开发,以便更好的进行更新和维护。
(2)对类中未进行声明的私有方法在类别中声明,可避免编译器警告。
(3)在不获悉,不改变原来代码的情况下往里面添加新的方法,对原有类进行扩展。
继承可以删除或修改方法,类别不可以。
继承可增加实例变量,类别不可以。
/*****************类别*****************/ #import <Foundation/Foundation.h> @interface NSString (Revert) - (void)tese; @end #import "NSString+Revert.h" @implementation NSString (Revert) -(void)tese { } @end /*****************继承*****************/ #import <Foundation/Foundation.h> @interface Revert : NSString - (void)test; @end #import "Revert.h" @implementation Revert - (void)test { } @end
3.类别和类延展的区别。
延展的@interface部分写在m文件中。
延展可以添加属性。另外延展添加的方法是必须要实现的。
延展可以认为是一个私有的类别。
4.oc中的协议和java中的接口概念有何不同?
OC中的协议分为正式协议和非正式协议。
正式协议和JAVA接口相同。
非正式协议使用类别category来实现,它可以列出对象能够执行的所有方法。
5.什么是KVO和KVC
键-值编码是一个用于间接访问对象属性的机制,不需要调用存取方法和变量实例就可以访问对象属性。支持带有对象值的属性,也支持纯数值类型和结构。
键-值观察是一种使对象获取其他对象特定属性变化的通知机制。当有变化发生时,通知直接发送至处于观察状态的对象。
6.代理的作用
使用代理无需子类化,可简化对象间的行为,容易实现且灵活。
7.oc中可修改和不可以修改类型
是否可以动态添加修改的区别。前者在初始化之后的内存空间不可变,后者可以动态申请新的内存。
8.我们说的oc是动态运行时语言是什么意思
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。
运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
9.通知和协议的不同之处?
协议拥有控制链的关系,而通知可以一对多,并不关心有多少接收到。
10.什么是推送消息?
推送是服务器端主动主动push消息到客户端的一种技术。
11.关于多态性
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。
12.对于单例的理解
通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
#import <Foundation/Foundation.h> @interface UserContext : NSObject<NSCopying> + (id)shareUserContext; @end #import "UserContext.h" staticUserContext *segtonInstance = nil; @implementation UserContext + (id)shareUserContext { @synchronized(self) { if (segtonInstance == nil) { segtonInstance = [[[selfclass] alloc] init]; } } returnsegtonInstance; } + (id)allocWithZone:(NSZone *)zone { if (segtonInstance == nil) { segtonInstance = [superallocWithZone:zone]; } returnsegtonInstance; } - (id)copyWithZone:(NSZone *)zone { returnsegtonInstance; } - (id)retain { returnsegtonInstance; } - (onewayvoid)release { } - (id)autorelease { returnsegtonInstance; } - (NSUInteger)retainCount { returnUINT_MAX; } @end
13.什么是事件响应链
responder chain是一系列连接的responder对象,通过responder对象可以将处理事件的责任传递给下一个,更高级的对象,即当前responder对象的nextResponder。
View->ViewController->UIWindow->UIApplication
若UIApplication对象不处理此事件,则事件被丢弃。
14.frame和bounds有什么不同?
frame指的是:该view在父view坐标系统中的位置和大小。
bounds指的是:该view在本身坐标系统中的位置和大小。
15.方法和选择器有何不同?
selector是一个方法的名字,method是一个组合体,包含了名字和实现
16.OC的垃圾回收机制?
Objective-C的垃圾回收机制继承自垃圾回收器,垃圾回收器定期检查变量和对象以及他们之间的指针,不再使用一个对象时,将指向它的指针设置为nil,这时垃圾回收器就会清理该对象。
IOS不能使用垃圾回收机制。
17.操作队列
类似线程池。用于处理ios多线程开发的问题。
先入队列的先开始执行,但不必等待执行完再执行下一个消息。
18.什么是懒汉模式
延时加载,在用到的时候才去初始化。
tableView中图片的加载显示,一个延时载,避免内存过高,一个异步加载,避免线程堵塞。
19.是否在一个视图控制器中嵌入两个tableview控制器?
可添加多个view,不可添加viewController。
20.一个tableView是否可以关联两个不同的数据源?你会怎么处理?
可以,通过代理方法实现关联多个数据源。