## 基础
##### 1. 为什么说Objective-C是一门动态的语言?
```
1. 什么叫动态静态?
静态、动态是相对的,这里动态语言指的是不需要在编译时确定所有的东西,在运行时还可以动态的添加变量、方法和类
Objective-C 可以通过Runtime 这个运行时机制,在运行时动态的添加变量、方法、类等,所以说Objective-C 是一门动态的语言
2. 其他说法
Objective-C 是C 的超集,在C 语言的基础上添加了面向对象特性,并且利用Runtime 这个运行时机制,为Objective-C 增添了动态的特性。
Objective-C 使用的是 “消息结构” 并非 “函数调用”:使用消息结构的的语言,其运行时所应执行的代码由运行期决定;而使用函数调用的语言,则由编译器决定
(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。
(2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。
因为在运行期可以继续向类中添加方法,所以编译器在编译时还无法确定类中是否有某个方法的实现。对于类无法处理一个消息就会触发消息转发机制
3. Objective-c的动态性
Objective-C的动态性,让程序在运行时判断其该有的行为,而不是像c等静态语言在编译构建时就确定下来。它的动态性主要体现在3个方面:
* 动态类型:如id类型。实际上静态类型因为其固定性和可预知性而使用的特别广泛。静态类型是强类型,动态类型是弱类型,运行时决定接收者。
* 动态绑定:让代码在运行时判断需要调用什么方法,而不是在编译时。与其他面向对象语言一样,方法调用和代码并没有在编译时连接在一起,而是在消息发送时才进行连接。运行时决定调用哪个方法。
* 动态载入。让程序在运行时添加代码模块以及其他资源。用户可以根据需要执行一些可执行代码和资源,而不是在启动时就加载所有组件。可执行代码中可以含有和程序运行时整合的新类。
```
##### 2. 讲一下MVC、MVP、MVVM?
###### MVC:
![AA](https://images2017.cnblogs.com/blog/1107494/201712/1107494-20171229160410054-1372857861.jpg)
```
MVC有两个很明显的问题:
1.m层和v层直接打交道,导致这两层耦合度高
2.因为所有逻辑都写在c层,导致c层特别臃肿
为了解决这两个问题,MVC的变种模式出现了MVP和MVVM.
```
###### MVP:
![AD](https://images2017.cnblogs.com/blog/1107494/201712/1107494-20171229160705413-1733012447.jpg)
```
p层代替了了c层,v层和m层的交互被p层隔断,从理论上去除了v和m层的耦合
但是造成p层比原来的c层更加臃肿,为了缓解这种臃肿,MVVM出现了
```
###### MVVM:
![AA](https://images2017.cnblogs.com/blog/1107494/201712/1107494-20171229161108492-95042495.jpg)
```
简单的来说MVVM其实就是MVP中把P层削弱为VM层,部分简单的逻辑职责分给了View层。
例如ng中的ng-if,ng-for....其实就是V层上的简单逻辑,这样做使得VM层相比起P层就没有这么臃肿了
```
[开发架构学习](https://www.jianshu.com/p/6a86f7fdc0cb)
##### 3. 为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?
###### iOS代理为啥要用weak修饰
防止循环引用。例如View有一个协议,需要一个代理实现回调。一个Controller添加这个View,并且遵守协议,成为View的代理。如果不用week,用strong,Controller ->View -> delegate -> Controller,就循环引用了。
```weak```:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制
```
@property (nonatomic, weak) id<HSDogDelegate>delegate;
```
```strong```:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(Retain Cycles)
```
@property (nonatomic, strong) id<HSDogDelegate>delegate;
```
###### 代理的delegate和dataSource有什么区别?
```
delegate偏重于与用户交互的回调,有那些方法可以供我使用,例如UITableviewDelegate;dataSource偏重于数据的回调,view里面有什么东西,属性都是什么,例如UITableviewDatasource;
```
###### 通知、block和代理的区别?
###### `代理`
```
特点是一对一的形式,而且逻辑结构非常清晰。实现起来较为简单:写协议 ,设置代理这个属性, 最好在你想通知代理做事情的方法中调用即可。当然这里面有一些细节,包括 ①协议定义时,请用关键字@required,和@optional来明确代理是否必须实现某些方法 ②代理的类型需用id类型,并写明要遵守的协议 ③就是在调用代理方法的时候需要判断代理是否实现该方法。
```
###### `Block`
```
这是苹果后来才加入的,也是目前开发比较常用的一种方式,功能比较强大,但是在理解和使用上可能需要一段时间摸索和熟悉。他的最大特点就是回调,而且回调时可以传入参数,最重要的是,无论在哪调用,block的执行都会回到block创建的地方执行,而非调用的地方。而block本身可以封装一段代码,一段代码你懂的,很多人在初学时会被搞晕,甚至在block的声明上就纠结,其实很正常,多用就好。
```
###### `通知`
```
通知的优点很明显,他是一对多的形式,而且可以在任意对象之间传递,不需要二者有联系,当然他的实现和代理相比较稍微绕一点,注册,发通知,收通知。这里面的注意点就是 ①对于系统没有定义的事件监听时需要自己发通知,这是你就需要定义一个key,字符串类型,这也是通知的一个弊端,你需要拷贝到收通知的对象,避免写错一个字母而无法收通知的尴尬 ②就是注册的通知中心需要手动移除,不然除了性能的问题还会有其他的问题出现,比如说一个控制器消失了之后还有因为某些事件而发出通知,造成不想要的结果
```
`学习过程:`
[block和代理的区别,哪个更好?](https://www.jianshu.com/p/27b27db01593)
[通知/代理/block 三者比对](https://www.cnblogs.com/zouhengwei/p/5433308.html)
##### 4. 属性的实质是什么?包括哪几部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesieze关键字是用来做什么的?
##### 5. 属性的默认关键字是什么?
##### 6. NSString为什么要用copy关键字,如果用strong会有什么问题?(注意这里没有说用strong就一定不行。使用copy和strong是看情况而定的)
##### 7. 如何令自己所写的对象具有拷贝功能?
##### 8. 可变集合类和不可变集合类的copy和mutablecopy有什么区别?如果是集合是内容复制的话,集合里面的元素也是内容复制吗?
##### 9. 为什么IBOutlet修饰的UIView也适用于weak关键字?
##### 10. nonatomic和atomic的区别? atomic是绝对线程安全吗?为什么?如果是那应该如何实现?
##### 11. UIColletionView自定义layout如何实现?
##### 12. 用StoryBoard开发的界面有什么弊端? 如何避免?
##### 13. 进程和线程的区别?同步和异步的区别? 并行和并发的区别?
##### 14. 线程间通信?
[线程间通信](https://www.jianshu.com/p/aacd3409f14b)
[什么是多线程,创建线程](https://www.jianshu.com/p/fc69da0dce7a)
[多线程之iOS线程间通信](https://www.jianshu.com/p/e0c0d43f9ab2)
##### 15. GCD的一些常用的函数? (group、barrire、信号量、线程同步)
##### 16. 如果使用队列来避免资源抢夺?
##### 17. 数据持久化的几个方案(fmdb)
##### 18. 说一下AppDelegate的几个方法? 从后台到前台调用了哪些方法? 第一次启动调用了哪些方法? 从前台到后台调用了哪些方法?
##### 19. NSCache优于NSDictionary的几点?
##### 20. 知不知道Designated Initializer?使用它的时候有什么需要注意的问题?
##### 21. 实现description方法能取得什么效果?
```
ios中的description方法,在iOS中description方法是一个非常实用的方法,在调试程序时,经常要打印并查看对象的信息。一种办法是编写代码把对象的全部属性都输出到日志中
```
[ios中的description方法](https://www.jianshu.com/p/08b59e425d2c)
##### 22. Objc使用什么机制管理对象内存?
```
通过 retainCount 的机制来决定对象是否需要释放。每次 runloop 的时候,都会检查对象的 retainCount,如果retainCount 为 0,说明该对象没有地方需要继续使用了,可以释放掉了。
```
[objc使用什么机制管理对象内存?](https://www.jianshu.com/p/7af21e300f57)
[内存管理](https://www.jianshu.com/p/0ad9957e3716)