## 基礎
##### 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:

```
MVC有兩個很明顯的問題:
1.m層和v層直接打交道,導致這兩層耦合度高
2.因為所有邏輯都寫在c層,導致c層特別臃腫
為了解決這兩個問題,MVC的變種模式出現了MVP和MVVM.
```
###### MVP:

```
p層代替了了c層,v層和m層的交互被p層隔斷,從理論上去除了v和m層的耦合
但是造成p層比原來的c層更加臃腫,為了緩解這種臃腫,MVVM出現了
```
###### MVVM:

```
簡單的來說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)