1.Difference between shallow copy and deep copy?
浅复制和深复制的区别?
答案:
浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
/*
意思就是说我有个A对象,复制一份后得到A_copy对象后
对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,
那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。
深复制就好理解了,内存中存在了两份独立对象本身。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。
*/
2.What is advantage of Categories
? What is difference between implementing a Category
and inheritance?
类别的作用?继承和类别在实现中有何区别?
答案:
Category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,
只能添加,不能删除修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
继承可以增加,扩展父类方法,并且可以增加属性。
3.Difference between categories and extensions?
类别和类扩展的区别
答案:
Category和extensions的不同在于后者可以添加属性。
另外后者添加的方法是必须要实现的。
extensions可以认为是一个私有的Category。
4.Difference between protocol in Objective-C
and interfaces in Java
?
Objective-C
中的协议和Java
中的接口概念有何不同?
答案:
OC中的协议有2层含义,官方定义为 formal和informal protocol。
前者和Java接口一样。
@informal @protocol 中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。
其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里
"非正式协议概念其实就是类别的另一种表达方式,这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作"。
这个意思是,这些是可选的。
比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。
然后你在后期可以直接使用这些更好的方法。
总的来说类别这玩意儿有点像协议的可选协议.
现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说"非正式协议使用interface修饰",
现在我们看到协议中两个修饰词:"必须实现(@requied)"和"可选实现(@optional)"。
OC中的协议(formal protocol)与java中的接口概念基本一致,
OC中非正式协议(informal protocol)就是类别。
在java中如果继承了接口,但不实现其方法,会得到一个error(无法编译);
在OC中的正式协议,如果不实现,会得到一个warning(可编译执行),
如果想去除waring,还可以加关键字(@optional),让它可选实现方法。
5.What are KVO and KVC?
答案:
KVC: 键 - 值编码
/*
是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
很多情况下可以简化程序代码。
apple文档其实给了一个很好的例子。
*/
KVO: 键值观察机制
/*
他提供了观察某一属性变化的方法,极大的简化了代码。
具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。
*/
比如我自定义的一个UIButton
[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 ([keyPath isEqualToString:@"highlighted"] ) {
[self setNeedsDisplay];
}
}
//对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。
对于KVC机制如何通过key寻找到value:
当通过KVC调用对象时,比如:
[self valueForKey:@"someKey"] 时,
/*
程序会自动试图通过几种不同的方式解析这个调用。
首先查找对象是否带有 someKey 这个方法,
如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),
如果还没有找到,程序会继续试图调用 - (id)valueForUndefinedKey:这个方法。
如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。
*/
/*
cocoachina.com注:
Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,
还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。
同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在.
*/
设计 "valueForUndefinedKey:" 方法的主要目的是当你使用 -(id)valueForKey 方法从对象中请求值时,
对象能够在错误发生前,有最后的机会响应这个请求。
这样做有很多好处,上面的例子也说明了这样做的好处.
"因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了"
可以按照KVC查找的逻辑理解。
*/
6.What is purpose of delegates?
代理的作用?
答案:
/*
代理的目的是改变或传递控制链。
允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。
另外一点,代理可以理解为java中的回调监听机制的一种类似。
*/
7.What are mutable and immutable types in Objective C?
Objective-C中可修改和不可以修改类型。
答案:
可修改不可修改的集合类。
这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。
比如NSArray和NSMutableArray。
/*
前者在初始化后的内存控件就是固定不可变的,
后者可以添加等,可以动态申请新的内存空间。
*/
8.When we call Objective-C
is runtime language what does it mean?
我们说的Objective-C
是动态运行时语言是什么意思?
答案:
多态.主要是将数据类型的确定由编译时,推迟到了运行时。
/*
这个问题其实浅涉及到两个概念,运行时和多态。
简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
*/
多态:
不同对象以自己的方式响应相同的消息的能力叫做多态。
意思就是假设生物类(life)都用有一个相同的方法-eat;
那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。
因此也可以说,运行时机制是多态的基础?~~~
9.what is difference between NSNotification and protocol?
通知和协议的不同之处?
答案:
协议有控制链(has-a)的关系,通知没有。
/*
1.通知:
通知需要有一个通知中心:NSNotificationCenter,自定义通知的话需要给一个名字,然后监听。
优点:通知的发送者和接受者都不需要知道对方。可以指定接收通知的具体方法。通知名可以是任何字符串。
缺点:较键值观察(KVO)需要多点代码,在删掉前必须移除监听者。
2.协议
通过setDelegate来设置代理对象,最典型的例子是常用的TableView.
优点:支持它的类有详尽和具体信息。
缺点:该类必须支持委托。某一时间只能有一个委托连接到某一对象。
*/
通俗点讲
1)通知只负责发出通知,剩下的事情就不管了,所以没有返回值,可以说是一对多;
2)delegate只是一对一,delegate方法往往需要关注返回值,也就是delegate方法的结果。
"控制链has-a"的具体理解,可自行百度。
*/
10.What is push notification?
什么是推送消息?
答案:
iOS中消息推送机制又叫消息机制,其包括两类:
1.本地通知;
2.推送通知,也叫远程通知。
/*
两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,
并且点击通知可以会打开应用程序,但是实现原理却完全不同:
本地通知是由本地应用触发的,它是基于时间行为的一种通知形式;
推送通知是由应用服务提供商发起的,通过苹果的APNs(Apple Push Notification Server)发送到应用客户端.
*/
11.Polymorphism?
关于多态性
答案:
多态:不同对象以自己的方式"响应相同的消息"(执行相同名称的函数方法)的能力叫做多态。
/*
由于每个类都有属于该类的命名空间,这使得多态名称变为可能。
类中定义的函数(方法)名字和类外定义的函数(方法)名字并不会冲突。
类的实例变量和类方法有如下特点:
C语言中结构体中的数据成员一样,类的实例变量也位于该类独有的命名空间。
类方法也同样位于该类独有的名字空间。与C语言中的方法名不同,类的方法名并不是一个全局符号。
一个类中的方法名不会和其他类中同样的方法名冲突。
两个完全不同的类可以实现同一个方法。
方法名是对象接口的一部分。对象收到的消息的名字就是调用的方法的名字。
因为不同的对象可以有同名的方法,所以对象必须能理解消息的含义。
同样的消息发给不同的对象,导致的操作并不相同。
多态的主要好处就是简化了编程接口。
它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。
这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。
*/
注意:Objective-C支持方法名的多态,但不支持参数和操作符的多态。
12.Singleton?
对于单例的理解
答案:
单例的目的就是为了在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死,该实例对象就不会被释放。
/*
单例是编程语言必备的基础。
基本能用熟悉的语言写出一个单例,以及可以运用到的场景或是你编程中碰到过运用的此种模式的框架类等。
进一步的话,考虑下如何在多线程访问单例时的安全性。
*/
13.What is responder chain?
说说响应链
答案:
事件响应链。包括点击事件,画面刷新事件等都是响应链的一种形态。
在视图栈内从上至下,或者从下之上传播。
可以说说点击事件的步骤,太抽象化了,没法写
14.Difference between frame and bounds?
frame和bounds有什么不同?
答案:
frame 指的是:该view在父view坐标系统中的位置和大小.(参照点是父亲的坐标系统)
bounds 指的是:该view在本身坐标系统中 的位置和大小.(参照点是本身坐标系统)
15.Difference between method and selector?
方法和选择器有何不同?
答案:
@selector 是一个方法的名字
"method" 是一个组合体,包含了方法名和实现.
具体不解析
16.Is there any garbage collection mechanism in Objective C.?
OC的垃圾回收机制?
答案:
OC是支持垃圾回收机制的(Garbage collection简称GC),
macOS开发中是支持的,但是iOS中,是不支持GC的。
/*
iOS开发是支持ARC(Automatic Reference Counting的简称),ARC是在IOS5之后推出的新技术,它与GC的机制是不同的。
我们在编写代码时,
不需要向对象发送release或者autorelease方法,
也不可以调用delloc方法,
编译器会在合适的位置自动给用户生成release消息(autorelease),
ARC 的特点是自动引用技术简化了内存管理的难度.
*/
17.NSOperation queue?
答案:
存放NSOperation的集合类。
操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。
//暂无更多详情,待修改
18.What is lazy loading?
答案:懒汉模式,只在用到的时候才去初始化。
也可以理解成延时加载。
我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。
一个延时载,避免内存过高,一个异步加载,避免线程堵塞。
19.Can we use two tableview controllers on one viewcontroller?
是否在一个视图控制器中嵌入两个tableview控制器?
答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,
只能说可以嵌入一个tableview视图。当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,
而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController
那样的感觉。
20.Can we use one tableview with two different datasources? How you will achieve this?
一个tableView是否可以关联两个不同的数据源?你会怎么处理?
答案:可以关联两个数据源,不过相对来说比较麻烦
数据源里的实现方法必须判断数据,比如不同的数据集合有不同的下标个数用于展示行数,以及展示的cell,并且cell的点击事件也要做相应的判断.常见的处理方法是在当前控制器生成成员属性记录当前显示枚举.
未完成,待整理