【面試題】iOS知識大全

 iOS知識點大全:html

 

一.Objc三大特性1.封裝2.繼承3.多態java

1> 什麼是多態ios

  多態:不一樣對象以本身的方式響應相同的消息的能力叫作多態。c++

  因爲每一個類都屬於該類的名字空間,這使得多態稱爲可能。類定義中的名字和類定義外的名字並不會衝突。類的實例變量和類方法有以下特色:程序員

  • 和C語言中結構體中的數據成員同樣,類的實例變量也位於該類獨有的名字空間。
  • 類方法也一樣位於該類獨有的名字空間。與C語言中的方法名不一樣,類的方法名並非一個全局符號。一個類中的方法名不會和其餘類中一樣的方法名衝突。兩個徹底不一樣的類能夠實現同一個方法。

  方法名是對象接口的一部分。對象收到的消息的名字就是調用的方法的名字。由於不一樣的對象能夠有同名的方法,因此對象必須能理解消息的含義。一樣的消息發給不一樣的對象,致使的操做並不相同。web

  多態的主要好處就是簡化了編程接口。它允許在類和類之間重用一些習慣性的命名,而不用爲每個新加的函數命名一個新名字。這樣,編程接口就是一些抽象的行爲的集合,從而和實現接口的類區分開來。算法

  Objective-C支持方法名的多態,但不支持參數和操做符的多態。數據庫

2> OC中如何實現多態編程

     在Objective-C中是經過一個叫作selector的選取器實現的。在Objective-C中,selector有兩個意思, 當用在給對象的源碼消息時,用來指方法的名字。它也指那個在源碼編譯後代替方法名的惟一的標識符。 編譯後的選擇器的類型是SEL有一樣名字的方法、也有一樣的選擇器。你可使用選擇器來調用一個對象的方法。設計模式

     選取器有如下特色:

     * 全部同名的方法擁有一樣的選取器

     * 全部的選取器都是不同的

     (1) SEL和@selector

          選擇器的類型是 SEL。@selector指示符用來引用選擇器,返回類型是SEL。

          例如:

         SEL responseSEL;      

                responseSEL = @selector(loadDataForTableView:);     

         能夠經過字符串來獲得選取器,例如:

               responseSEL = NSSelectorFromString(@"loadDataForTableView:");

         也能夠經過反向轉換,獲得方法名,例如:

               NSString  *methodName = NSStringFromSelector(responseSEL);

     (2) 方法和選取器

         選取器肯定的是方法名,而不是方法實現。這是多態性和動態綁定的基礎,它使得向不一樣類對象發送相同的消息成爲現實;不然,發送     消息和標準C中調用方法就沒有區別,也就不可能支持多態性和動態綁定。

         另外,同一個類的同名類方法和實例方法擁有相同的選取器。

     (3) 方法返回值和參數類型

         消息機制經過選取器找到方法的返回值類型和參數類型,所以,動態綁定(例:向id定義的對象發送消息)須要同名方法的實現擁有相     同返回值類型和相同的參數類型;不然,運行時可能出現找不到對應方法的錯誤。

         有一個例外,雖然同名類方法和實例方法擁有相同的選取器,可是它們能夠有不一樣的參數類型和返回值類型。

3> 動態綁定

 

 

二.類和對象

1.category

1> 分類拓展協議中哪些能夠聲明屬性?

均可以,但分類和協議建立的屬性只至關於方法,可是內部沒有對成員變量的操做(沒法建立成員變量),拓展能夠

代理中聲明屬性,沒有實際建立成員變量,至關於聲明瞭屬性名對應的訪問方法,遵照協議的類須要實現對應的訪問器方法,不然運行報錯

分類中聲明屬性,警告提示須要手動實現訪問器方法(Swift中叫計算型屬性),而分類中不能建立成員變量,能夠在手寫訪問器方法中使用runtime的 objc_setAssociatedObject方法關聯對象間接建立屬性(靜態庫添加屬性)

拓展裏能夠聲明屬性,直接可使用

2> 繼承和類別的區別

1> 使用繼承:

1.1> 添加新方法和父類方法一致,但父類方法仍須要使用

1.2> 添加新屬性

2> 類別:

2.1> 針對系統提供的一些類,系統自己不提倡繼承,由於這些類的內部實現對繼承有所限制(NSString initWithFormat繼承崩潰)

2.2> 類別能夠將本身構建的類中的方法進行分組,對於大型的類,提升可維護性

3> 分類的做用

將類的實現分散到多個不一樣文件或多個不一樣框架中。

建立對私有方法的前向引用。

向對象添加非正式協議。

4> 分類的侷限性

沒法向類中添加新的實例變量,類別沒有位置容納實例變量。

名稱衝突,即當類別中的方法與原始類方法名稱衝突時,類別具備更高的優先級。類別方法將徹底取代初始方法從而沒法再使用初始方法。

沒法添加實例變量的侷限可使用字典對象解決.

2.extension

3.protocol

 

 

三.Foundation

1.字符串

2.NSArrayNSDictionary

1> iOS遍歷數組/字典的方法

數組:  for循環  for in    enumerateObjectsUsingBlock(正序)    enumerateObjectsWithOptions:usingBlock:(多一個遍歷選項,不保證順序)

字典:

1. for(NSString *object in [testDic allValues])

2. for(id akey in [testDic allKeys]){

[sum appendString:[testDic objectForKey:akey]];  }

3. [testDic enumerateKeysAndObjectsUsingBlock:^(idkey,idobj,BOOL*stop) {

        [sum appendString:obj];  } ];

速度:  對於數組, 加強for最快,普通for和block速度差很少,加強最快是由於加強for語法會對容器裏的元素的內存地址創建緩衝,遍歷的時候直接從緩衝中取元素地址而不是經過調用方法來獲取,因此效率高.這也是使用加強for時不能在循環體中修改容器元素的緣由之一(能夠在循環體中添加標記,在循環體外修改元素)

對於字典,allValues最快,allKey和block差很少,緣由是allKey須要作objcetForKey的方法

3.NSValue NSNumber 

1> 歸檔視圖尺寸,座標

 

 

四.關鍵字

1.@property

1>readwritereadonlyassignretaincopynonatomic屬性的做用

@property是一個屬性訪問聲明,擴號內支持如下幾個屬性:

1.1> getter setter

getter=getterName,setter=setterName,設置setter與getter的方法名

1.2> weak assign strong copy

assign  用於非指針變量。用於基礎數據類型 (例如NSInteger)和C數據類型(int, float, double, char, 等),另外還有id,其setter方法直接賦值,不進行任何retain操做

weak    用於指針變量,比assign多了一個功能,當對象消失後自動把指針變成nil,因爲消息發送給空對象表示無操做,這樣有效的避免了崩潰(野指針),爲了解決原類型與循環引用問題

strong  用於指針變量,setter方法對參數進行release舊值再retain新值

copy    用於指針變量,setter方法進行copy操做,與retain處理流程同樣,先舊值release,再copy出新的對象,retainCount爲1。這是爲了減小對上下文的依賴而引入的機制。copy是在你不但願a和b共享一塊內存時會使用到。a和b各自有本身的內存。

1.3> readwrite,readonly,設置可供訪問級別

1.4> nonatomic,非原子性訪問,不加同步,多線程併發訪問會提升性能。注意,若是不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。因此約定俗成只在主線程更新UI,防止多線程設置UI屬性,出現資源搶奪現象

2> 如何避免循環引用 

兩個對象相互強引用,都沒法release,解決辦法爲一個使用strong,一個使用assign(weak)

3> delegate的屬性爲何使用assign/weak

避免出現循環引用,場景如UITableViewController強引用視圖UITableView,而該視圖的代理又是控制器,爲避免循環引用,讓delegate爲弱引用

 

2.copy

1> copy的使用場景

當多個指針指向同一個對象時,爲避免一個指針對對象的改動對其餘指針的使用產生影響,使用copy來建立對象的副本

如頁面間傳值使用copy,A向B控制器傳屬性(屬性爲自定義對象),爲避免因A的屬性變化對B的屬性產生影響

再如多人開發或封裝庫,在不明確傳入值爲可變仍是不可變的狀況下,使用copy更安全

2> 什麼是深拷貝淺拷貝

對於非容器類對象,不可變對象進行copy操做爲淺拷貝,引用計數器加1,其餘三種爲深拷貝

對於容器類對象,基本和非容器類對象一致,但注意其深拷貝是對象自己是對象複製,其中元素仍爲指針複製,系統將initWithArray方法歸爲了元素深拷貝,但其實若是元素爲不可變元素,仍爲指針複製,使用歸解檔能夠實現真正的深拷貝,元素也是對象拷貝NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:

[NSKeyedArchiver archivedDataWithRootObject: array]];

3> 字符串何時使用copy,strong

屬性引用的對象由兩種狀況,可變和不可變字符串

引用對象不可變狀況下,copy和strong同樣,copy爲淺拷貝

引用對象可變狀況下,若是但願屬性跟隨引用對象變化,使用strong,但願不跟隨變化使用copy

4> 字符串所在內存區域

@「abc」 常量區   stringwithformat 堆區

5> mutablecopycopy    @property(copy) NSMutableArray *arr;這樣寫有什麼問題

mutablecopy返回可變對象,copy返回不可變對象

6> 如何讓自定義類可使用copy修飾符

實現<NSCopying>協議,重寫copyWithZone方法

 

五.runtime/消息轉發機制

1.runtime   http://www.cocoachina.com/ios/20150715/12540.html

1> 什麼是runtime

runtime是一套比較底層的純C語言API, 屬於1個C語言庫, 包含了不少底層的C語言API。

在咱們平時編寫的OC代碼中, 程序運行過程時, 其實最終都是轉成了runtime的C語言代碼, runtime算是OC的幕後工做者,objc_msgSend

2> runtime幹什麼用,使用場景

runtime是屬於OC的底層, 能夠進行一些很是底層的操做(用OC是沒法現實的, 很差實現)

在程序運行過程當中, 動態建立一個類(好比KVO的底層實現)  objc_allocateClassPair,class_addIvar,objc_registerClassPair

在程序運行過程當中, 動態地爲某個類添加屬性\方法, 修改屬性值\方法(修改封裝的框架)  objc_setAssociatedObject   object_setIvar

遍歷一個類的全部成員變量(屬性)\全部方法(字典轉模型,歸解檔)  class_copyIvarList class_copyPropertyList  class_copyMethodList

2.消息機制

1> 消息轉發的原理

當向一個對象發送消息時,objc_msgSend方法根據對象的isa指針找到對象的類,而後在類的調度表(dispatch table)中查找selector。若是沒法找到selector,objc_msgSend經過指向父類的指針找到父類,並在父類的調度表(dispatch table)中查找selector,以此類推直到NSObject類。一旦查找到selector,objc_msgSend方法根據調度表的內存地址調用該實現。 經過這種方式,message與方法的真正實如今執行階段才綁定。

    爲了保證消息發送與執行的效率,系統會將所有selector和使用過的方法的內存地址緩存起來。每一個類都有一個獨立的緩存,緩存包含有當前類本身的 selector以及繼承自父類的selector。查找調度表(dispatch table)前,消息發送系統首先檢查receiver對象的緩存。

 緩存命中的狀況下,消息發送(messaging)比直接調用方法(function call)只慢一點點點點。

2> SEL isa super cmd 是什麼

sel: 一種類型,表示方法名稱,相似字符串(可互轉)

isa:在方法底層對應的objc_msgSend調用時,會根據isa找到對象所在的類對象,類對象中包含了調度表(dispatch table),該表將類的sel和方法的實際內存地址關聯起來

super_class:每個類中還包含了一個super_class指針,用來指向父類對象

_cmd在Objective-C的方法中表示當前方法的selector,正如同self表示當前方法調用的對象實例

IMP定義爲 id (*IMP) (id, SEL, …)。這樣說來, IMP是一個指向函數的指針,這個被指向的函數包括id(「self」指針),調用的SEL(方法名),再加上一些其餘參數.說白了IMP就是實現方法

3> 動態綁定

—在運行時肯定要調用的方法

動態綁定將調用方法的肯定也推遲到運行時。在編譯時,方法的 調用並不和代碼綁定在一塊兒,只有在消實發送出來以後,才肯定被調用的代碼。經過動態類型和動態綁定技術,您的代碼每次執行均可以獲得不一樣的結果。運行時因 子負責肯定消息的接收者和被調用的方法。運行時的消息分發機制爲動態綁定提供支持。當您向一個動態類型肯定了的對象發送消息時,運行環境系統會經過接收者 的isa指針定位對象的類,並以此爲起點肯定被調用的方法,方法和消息是動態綁定的。並且,您沒必要在Objective-C 代碼中作任何工做,就能夠自動獲取動態綁定的好處。您在每次發送消息時,特別是當消息的接收者是動態類型已經肯定的對象時,動態綁定就會例行而透明地發生。

 

 

六.內存管理

1.內存區域

1>堆和棧的區別

管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生memory leak。

申請大小:

棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就肯定的常數),若是申請的空間超過棧的剩餘空間時,將提示overflow。所以,能從棧得到的空間較小。

堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。

碎片問題:

對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。對於棧來說,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存塊從棧中間彈出

分配方式:

堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,好比局部變量的分配。動態分配由alloca函數進行分配,可是棧的動態分配和堆是不一樣的,他的動態分配是由編譯器進行釋放,無需咱們手工實現。

分配效率:

棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。

2.iOS內存管理

1> 字符串的內存管理

建立字符串的內存空間  堆  常量區

2> 循環引用

delegate屬性的內存策略 

block循環引用   實際場景

3> autorelease的使用   工廠方法爲何不釋放對象  ARCautorelease的使用場景

避免內存峯值

SDWebimage中加載gif圖片  大循環

棧結構 棧頂

統一發release消息

4> ARC和MRC的混用

4.1> MRC>ARC

把MRC的代碼轉換成ARC的代碼,刪除內存管理操做(手動)

xcode提供了自動將MRC轉換成ARC的功能,操做菜單欄edit -> Refacotor(重構) -> Convert to Objective-C ARC

4.2> ARC>MRC

在ARC項目中繼續使用MRC編譯的類,在編譯選項中標識MRC文件便可"-fno-objc-arc"

在MRC項目中繼續使用ARC編譯的類在編譯選項中標識MRC文件便可"-fobjc-arc"

 

3.跨平臺

3> OCC框架對象引用

oc和c 橋接 三個橋接關鍵字都是幹麼的 __bridge  不更改歸屬權  __bridge_transfer 全部權給OC   __bridge_retain 解除OC的全部權

 

ios5/6/7/8 內存方面的區別?

ios5.自動引用計數 (ARC)

ios6.UICollectionView ( 內存重用機制,圖片展現瀑布流實現 )  在didReceiveMemoryWarning中處理內存(6以前在ViewDidUnload中) http://blog.csdn.net/likendsl/article/details/8199350

ios7.iOS7之後強制使用ARC

ios8

 

 

七.數據傳遞

1.block

1> block屬性爲何用copy?

棧->堆

2> block使用注意什麼?

循環引用  修改外部變量

3> block的主要使用場景 ?

動畫

數組字典排序遍歷

回調狀態

錯誤控制

多線程GCD

4>block原理

block屬性是指向結構體的指針,

 

2.Delegate

4> 何時用delegate,何時用Notification

delegate針對one-to-one關係,而且reciever能夠返回值給sender,notification 能夠針對one-to-one/many/none,reciever沒法返回值給sender.因此,delegate用於sender但願接受到 reciever的某個功能反饋值,notification用於通知多個object某個事件。

5> delegate和block

block使代碼更緊湊,便於閱讀,delegate能夠設置必選和可選的方法實現,相比block

block能夠訪存局部變量. 不須要像之前的回調同樣,把在操做後全部須要用到的數據封裝成特定的數據結構, 你徹底能夠直接訪問局部變量.

 

3.KVCKVO

1> 如何調用私有變量    如何修改系統的只讀屬性    KVC的查找順序

KVC在某種程度上提供了訪問器的替代方案。不過訪問器方法是一個很好的東西,以致於只要是有可能,KVC也儘可能再訪問器方法的幫助下工做。爲了設置或者返回對象屬性,KVC按順序使用以下技術:

①檢查是否存在-<key>、-is<key>(只針對布爾值有效)或者-get<key>的訪問器方法,若是有可能,就是用這些方法返回值;

檢查是否存在名爲-set<key>:的方法,並使用它作設置值。對於 -get<key>和 -set<key>:方法,將大寫Key字符串的第一個字母,並與Cocoa的方法命名保持一致;

②若是上述方法不可用,則檢查名爲-_<key>、-_is<key>(只針對布爾值有效)、-_get<key>和-_set<key>:方法;

③若是沒有找到訪問器方法,能夠嘗試直接訪問實例變量。實例變量能夠是名爲:<key>或_<key>;

④若是仍爲找到,則調用valueForUndefinedKey:和setValue:forUndefinedKey:方法。這些方法的默認實現都是拋出異常,咱們能夠根據須要重寫它們。

2> 什麼是鍵-值,鍵路徑是什麼

模型的性質是經過一個簡單的鍵(一般是個字符串)來指定的。視圖和控制器經過鍵來查找相應的屬性值。在一個給定的實體中,同一個屬性的全部值具備相同的數據類型。鍵-值編碼技術用於進行這樣的查找—它是一種間接訪問對象屬性的機制。

鍵路徑是一個由用點做分隔符的鍵組成的字符串,用於指定一個鏈接在一塊兒的對象性質序列。第一個鍵的性質是由先前的性質決定的,接下來每一個鍵的值也是相對於其前面的性質。鍵路徑使您能夠以獨立於模型實現的方式指定相關對象的性質。經過鍵路徑,您能夠指定對象圖中的一

個任意深度的路徑,使其指向相關對象的特定屬性。

3> 什麼是KVCKVO

KVC(Key-Value-Coding)內部的實現:一個對象在調用setValue的時候,(1)首先根據方法名找到運行方法的時候所須要的環境參數。(2)他會從本身isa指針結合環境參數,找到具體的方法實現的接口。(3)再直接查找得來的具體的方法實現。KVO(Key-Value- Observing):當觀察者爲一個對象的屬性進行了註冊,被觀察對象的isa指針被修改的時候,isa指針就會指向一箇中間類,而不是真實的類。因此 isa指針其實不須要指向實例對象真實的類。因此咱們的程序最好不要依賴於isa指針。在調用類的方法的時候,最好要明確對象實例的類名

4> kvo的實現機制

當某個類的對象第一次被觀察時,系統就會在運行時動態地建立該類的一個派生類,在這個派生類中重寫原類中被觀察屬性的setter方法,派生類在被重寫的setter方法實現真正的通知機制(Person->NSKVONotifying_Person).

派生類重寫了 class 方法以「欺騙」外部調用者它就是起初的那個類。而後系統將這個對象的isa指針指向這個新誕生的派生類,所以這個對象就成爲該派生類的對象了,於是在該對象上對setter的調用就會調用重寫的setter,從而激活鍵值通知機制。此外,派生類還重寫了dealloc方法來釋放資源。

5> kvo使用場景

①實現上下拉刷新控件 contentoffset

②webview混合排版 contentsize

③監聽模型屬性實時更新UI

 

 

UI

一.控件

1.屬性

1> framebounds的區別

        frame:可表示尺寸和位置,與父視圖座標系的關係,位置以本身的左上角爲原點,可用於形變和位移

bounds:可表示尺寸和位置,與自身視圖座標系的關係,大多數狀況(滾動視圖的子視圖等除外)以本身的中心點爲原點,可用於形變

center:只表示位置,表示本身中心的座標,可用於位移

2> trasform

修改位移\形變\旋轉,transform不一樣於board\center\frame,前者中記錄的是形變的數據,不發生形變其值是空的,因此咱們須要新建結構體,用CGAffineTransform(仿射變換)函數給對象結構體屬性賦值,然後者是控件的固有屬性,內存數據是始終存在的,當咱們用他們作移動等操做時,是改變其值,因此是結構體賦值三步曲,不用CG的函數

使用情景區別: transform通常用於有來有回的變化,而frame是有去無回

2.UITableview

1> 自定義高度

1.1>新建一個繼承自UITableViewCell的類

1.2>重寫initWithStyle:reuseIdentifier:方法

1.3>添加全部須要顯示的子控件(不須要設置子控件的數據和frame,  子控件要添加到contentView中)

1.4>進行子控件一次性的屬性設置(有些屬性只須要設置一次, 好比字體\固定的圖片)

1.5>提供2個模型

數據模型: 存放文字數據\圖片數據

frame模型: 存放數據模型\全部子控件的frame\cell的高度

1.6>cell擁有一個frame模型(不要直接擁有數據模型)

1.7>重寫frame模型屬性的setter方法: 在這個方法中設置子控件的顯示數據和frame

 

3.UICollectionView

1> 如何實現瀑布流,流水佈局

經過實現UICollectionViewDelegateFlowLayout去改變單元格大小

2> 和UITableView的使用區別

1)必須使用下面的方法進行Cell類的註冊:

  1. - (void)registerClass:forCellWithReuseIdentifier:
  2. - (void)registerClass:forSupplementaryViewOfKind:withReuseIdentifier:
  3. - (void)registerNib:forCellWithReuseIdentifier:

2)collectionView與tableView最大的不一樣點,collectionView必需要使用本身的layout(UICollectionViewLayout)

如:

  1.     UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
  2.     flowLayout.itemSize = CGSizeMake(52, 52);               // cell大小
  3.     flowLayout.minimumInteritemSpacing = 1;                 // cell間距
  4.     flowLayout.minimumLineSpacing = 1;                      // cell行距
  5.     flowLayout.sectionInset = (UIEdgeInsets){81,1,1,1};     // cell邊距

建立collectionView須要帶Layout的初始化方法:

  1. - (id)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout;

 

二.生命週期

1> 應用的生命週期

各個程序運行狀態時代理的回調:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions  告訴代理進程啓動但還沒進入狀態保存

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions   告訴代理啓動基本完成程序準備開始運行

- (void)applicationWillResignActive:(UIApplication *)application   當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,好比來電話了

- (void)applicationDidBecomeActive:(UIApplication *)application    當應用程序入活動狀態執行,這個恰好跟上面那個方法相反

- (void)applicationDidEnterBackground:(UIApplication *)application   當程序被推送到後臺的時候調用。因此要設置後臺繼續運行,則在這個函數裏面設置便可

- (void)applicationWillEnterForeground:(UIApplication *)application   當程序從後臺將要從新回到前臺時候調用,這個恰好跟上面的那個方法相反。

- (void)applicationWillTerminate:(UIApplication *)application   當程序將要退出是被調用,一般是用來保存數據和一些退出前的清理工做。

 

2> 視圖的生命週期

loadView - 默認調用super方法,根據控制器建立方式加載視圖,重寫後將根據重寫方法建立視圖

viewDidLoad-視圖加載完成

viewWillAppear-UIViewController對象的視圖即將加入窗口時調用;

viewDidApper-UIViewController對象的視圖已經加入到窗口時調用;

viewWillDisappear-UIViewController對象的視圖即將消失、被覆蓋或是隱藏時調用;

viewDidDisappear-UIViewController對象的視圖已經消失、被覆蓋或是隱藏時調用;

viewVillUnload-當內存太低時,須要釋放一些不須要使用的視圖時,即將釋放時調用;

viewDidUnload-當內存太低,釋放一些不須要的視圖時調用。

 

 

四.核心繪圖

6> Viewlayer的區別

圖層不會直接渲染到屏幕上,UIView是iOS系統中界面元素的基礎,全部的界面元素都是繼承自它。它自己徹底是由CoreAnimation來實現的。它真正的繪圖部分,是由一個CALayer類來管理。UIView自己更像是一個CALayer的管理器。一個UIView上能夠有n個CALayer,每一個layer顯示一種東西,加強UIView的展示能力。

6.1>均可以顯示屏幕效果

6.2> 若是須要用戶交互就要用UIVIew,其可接收觸摸事件(繼承UIResponder),而CALayer不能接收觸摸事件

6.3> 若是沒有用戶交互可選用CALayer,由於其所在庫較小,佔用的資源較少

7> newalloc init的區別

採用new的方式只能採用默認的init方法完成初始化,採用alloc的方式能夠用其餘定製的初始化方法。

 

六.事件處理

1> 描述響應者鏈條

當觸摸事件發生時,壓力轉爲電信號,iOS系統將產生UIEvent對象,記錄事件產生的時間和類型,而後系統將事件加入到一個由UIApplication管理的事件隊列中。

UIApplication會從事件隊列中取出最前面的事件,並將事件分發下去以便處理,一般,先發送事件給應用程序的主窗口(keyWindow)

主窗口會在視圖層次結構中找到一個最合適的視圖來處理觸摸事件(從父到子,從後到前),這也是整個事件處理過程的第一步

找到合適的視圖控件後,就會調用視圖控件的touches方法來做具體的事件處理

4.Runloop

1> 每一個線程上都有一個runloop,主線程默認開啓,輔助線程須要手動開啓,主要用於

  1. 使用端口或自定義輸入源來和其餘線程通訊
  2. 使用線程的定時器
  3. Cocoa中使用任何performSelector…的方法
  4. 使線程週期性工做

 

七.屏幕適配

 

多線程

一.資源搶奪

2> 資源搶奪解決方案

@sychronized{ }

dispatch_barrier_async

NSLock NSCondition

dispatch_semaphore_wait

 

二.iOS多線程技術

3> 對比iOS中的多線程技術

3.1> pthread

pthread跨平臺,使用難度大,須要手動管理線程生命週期

pthread_create建立線程,傳參線程標記,線程屬性,初始函數,函數參數

3.2> NSThread

NSThread須要手動管理線程生命週期和

3.3> GCD

3.4> NSOperation

 

GCD是純C語言的API,NSOperationQueue是基於GCD的OC版本封裝

3.2> GCD僅僅支持FIFO隊列,只能夠設置隊列的優先級,而NSOperationQueue中的每個任務均可以被從新設置優先級(setQueuePriority:),從而實現不一樣操做的執行順序調整

3.3> GCD不支持異步操做之間的依賴關係設置。若是某個操做的依賴另外一個操做的數據,使用NSOperationQueue可以設置依賴按照正確的順序執行操做(addDependency:)。GCD則沒有內建的依賴關係支持(只能經過Barrior和同步任務手動實現)。

3.4> NSOperationQueue方便中止隊列中的任務(cancelAllOperations, suspended),GCD不方便中止隊列中的任務.

3.5> NSOperationQueue支持KVO,能夠監測operation是否正在執行(isExecuted)、是否結束(isFinished),是否取消(isCanceld)

3.6> GCD的執行速度比NSOperationQueue快

3.7> NSOperationQueue可設置最大併發數量(節電),GCD具備dispatch_once(只執行一次,單例)和dispatch_after(延遲執行)功能

3.8> NSObject分類(perform)和NSThread遇到對象分配須要手動內存管理,手動管理線程生命週期

3.9> NSThread查看線程

3.10> NSObject分類線程通訊

 

4> 原子屬性

原子屬性採用的是"多讀單寫"機制的多線程策略

"多讀單寫"縮小了鎖範圍,比互斥鎖的性能好

規定只在主線程更新UI,就是由於若是在多線程中更新,就須要給UI對象加鎖,防止資源搶佔寫入錯誤,可是這樣會下降UI交互的性能,因此ios設計讓全部UI對象都是非線程安全的(不加鎖),並規定只在主線程中更新UI,規避多線程搶佔資源問題

 

三.其餘

5> 多線程優缺點

優勢:

使應用程序的響應速度更快,用戶界面在進行其餘工做的同時仍始終保持活動狀態;

優化任務執行,適當提升資源利用率(cpu, 內存);

缺點:

線程佔用內存空間,管理線程須要額外的CPU開銷,開啓大量線程,下降程序性能;

增長程序複雜度,如線程間通訊,多線程的資源共享等;

1> 在多線程中使用通知須要注意什麼問題?

 

網絡

一.網絡基礎

1.數據解析

1> XML解析方式

SAX 方式解析

-只讀

-速度快

-從上向下

-經過5個代理方法解析,每一個代理方中都須要寫一些代碼!

-若是要實現SAX解析,思路最重要!

-適合比價大的XML的解析

DOM解析的特色

-一次性將XML所有加載到內存,以樹形結構

-好處,能夠動態的修改,添加,刪除節點

-內存消耗很是大!尤爲橫向節點越深!

-iOS默認不支持 DOM 解析!

-在 MAC 端,或者服務器端開發,都基本上使用 DOM 解析

-在 iOS 端若是須要使用 DOM 方式解析,可使用第三方框GData/KissXML(XMPP)

-適合比較小的 XML 文件

-在 MAC 中,蘋果提供了一個 NSXML 的類,可以作 DOM 解析,在 iOS 不能使用!

2.網絡協議

1>TCP如何防止亂序和丟包

    TCP數據包的頭格式中有兩個概念,Sequence Number是數據包的序號,用來解決網絡包亂序(reordering)問題。Acknowledgement Number就是ACK——用於確認收到,用來解決不丟包的問題。

    位碼即tcp標誌位,有6種標示:SYN(synchronous創建聯機)        ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)Sequence number(順序號碼) Acknowledge number(確認號碼).

   SeqNum的增長是和傳輸的字節數相關的,TCP傳輸數據時,A主機第一次傳輸1440個字節,seq=1,那麼第二次時seq = 1441,B拼接數據就是根據seq進行拼接的,seq數字不斷累加避免了亂序.B主機收到第一次數據包之後會返回ack = 1441.

    A主機收到B的ack = 1441時,就知道第一個數據包B已收到. 若是B沒有收到第一次的數據包,那麼B再收到A的數據包時,他就會發ack = 1回去,A收到B的回覆,發現B沒有收到第一次數據包,就會重發第一次數據包,這樣就能夠防止丟包.

 

2>描述一下三次握手

 

   第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;

   第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

   第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。完成三次握手,客戶端與服務器開始傳送數據.

 

3> TCPUDP的區別:

3.1>基於鏈接與無鏈接;

3.2>對系統資源的要求(TCP較多,UDP少);

3.3>UDP程序結構較簡單;

3.4>流模式與數據報模式 ;

3.5>TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。

 

4>httpscoket通訊的區別

http是客戶端用http協議進行請求,發送請求時候須要封裝http請求頭,並綁定請求的數據,服務器通常有web服務器配合(固然也非絕對)。 http請求方式爲客戶端主動發起請求,服務器才能給響應,一次請求完畢後則斷開鏈接,以節省資源。服務器不能主動給客戶端響應(除非採起http長鏈接技術)。iPhone主要使用類是NSUrlConnection。

scoket是客戶端跟服務器直接使用socket「套接字」進行鏈接,並無規定鏈接後斷開,因此客戶端和服務器能夠保持鏈接通道,雙方均可以主動發送數據。通常在遊戲開發或股票開發這種要求即時性很強而且保持發送數據量比較大的場合使用。主要使用類是CFSocketRef。

 

3.網絡傳輸

1>DNS是如何工做的

DNS是domain name server的簡稱,每一個網絡的計算機都有ip,可是很差記,因此用域名替代(如www.baidu.com),在 Internet 上真實在辨識機器的仍是 IP,因此當使用者輸入Domain Name 後,瀏覽器必需要先去一臺有 Domain Name 和IP 對應資料的主機去查詢這臺電腦的 IP,而這臺被查詢的主機,咱們稱它爲 Domain Name Server,簡稱DNS,例如:當你輸入www.pchome.com.tw時,瀏覽器會將www.pchome.com.tw這個名字傳送到離他最近的 DNS Server 去作辨識,若是查到,則會傳回這臺主機的 IP,進而跟它索取資料,但若是沒查到,就會發生相似 DNS NOT FOUND 的情形,因此一旦DNS Server當機,就像是路標徹底被毀壞,沒有人知道該把資料送到那裏

 

二.網絡安全/加密

 

料送到那裏

 

三.數據存儲

1.數據存儲技術

1> 數據存儲的幾種方式

1.1> plist xml

1.2> 偏好設置

1.3> 歸檔  Document 自定義對象 NSCoding協議

如何使用plist保存視圖尺寸 NSValue

2> 沙盒目錄結構

2.1> Library Caches Preferences

2.2> Documents

2.3> tmp

 

2.數據庫技術(SQLite&CoreData

 

 

四.Html5/oc&js互調

oc>js:[self.webView stringByEvaluatingJavaScriptFromString:「window.location.href = xxx」];

js>oc: 利用hmtl中js的重定向技術,<Script> window.location.href = www.baidu.com//method:dosomething </Script> 

使用方法截取重定向

(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

 

五.iOS網絡框架

1> NSURLConnection和NSURLSession的區別

1.1> 異步請求不須要NSOperation包裝

1.2> 支持後臺運行的網絡任務(後臺上傳下載)

1.3> 根據每一個Session作配置(http header,Cache,Cookie,protocal,Credential),再也不在整個App層面共享配置

1.4> 支持網絡操做的取消和斷點續傳(繼承系統類,從新main方法)

1.5> 改進了受權機制的處理

 

項目

1.實用技術

2.知名第三方框架

3.開發技巧

1> description方法

 

Swift

1> SwiftOC的區別

1.1> Swift沒有地址/指針的概念

1.2> 泛型

1.3> 類型嚴謹 對比oc的動態綁定

 

6.設計模式

1> 經常使用的設計模式

  代理  觀察者  工廠  單例   策略

2> 代理屬性的內存策略是什麼,爲何?

3> 觀察者模式的使用場景

4> 工廠模式(類方法)爲何沒有釋放對象? autorelease工做原理? arc下還須要手動使用autorelease嗎?爲何?什麼場景?

5> 手寫單例

6> 策略  cell多種響應效果   代理方法

 

(一)代理模式

 應用場景:當一個類的某些功能須要由別的類來實現,可是又不肯定具體會是哪一個類實現。

 優點:解耦合

 敏捷原則:開放-封閉原則

 實例:tableview的 數據源delegate,經過和protocol的配合,完成委託訴求。

 列表row個數delegate

 自定義的delegate

 

 (二)觀察者模式

 應用場景:通常爲model層對controller和view進行的通知方式,不關心誰去接收,只負責發佈信息。

 優點:解耦合

 敏捷原則:接口隔離原則,開放-封閉原則

 實例:Notification通知中心,註冊通知中心,任何位置能夠發送消息,註冊觀察者的對象能夠接收。

kvo,鍵值對改變通知的觀察者,平時基本沒用過。

 

(三)MVC模式

 應用場景:是一中很是古老的設計模式,經過數據模型,控制器邏輯,視圖展現將應用程序進行邏輯劃分。

 優點:使系統,層次清晰,職責分明,易於維護

 敏捷原則:對擴展開放-對修改封閉

 實例:model-即數據模型,view-視圖展現,controller進行UI展示和數據交互的邏輯控制。

 

 (四)單例模式

 應用場景:確保程序運行期某個類,只有一份實例,用於進行資源共享控制。

 優點:使用簡單,延時求值,易於跨模塊

 敏捷原則:單一職責原則

 實例:[UIApplication sharedApplication]。

 注意事項:確保使用者只能經過 getInstance方法才能得到,單例類的惟一實例。

java,C++中使其沒有公有構造函數,私有化並覆蓋其構造函數。

object c中,重寫allocWithZone方法,保證即便用戶用 alloc方法直接建立單例類的實例,返回的也只是此單例類的惟一靜態變量。

 

 (五)策略模式

 應用場景:定義算法族,封裝起來,使他們之間能夠相互替換。

 優點:使算法的變化獨立於使用算法的用戶

 敏捷原則:接口隔離原則;多用組合,少用繼承;針對接口編程,而非實現。

 實例:排序算法,NSArray的sortedArrayUsingSelector;經典的鴨子會叫,會飛案例。

 注意事項:1,剝離類中易於變化的行爲,經過組合的方式嵌入抽象基類

2,變化的行爲抽象基類爲,全部可變變化的父類

3,用戶類的最終實例,經過注入行爲實例的方式,設定易變行爲

 防止了繼承行爲方式,致使無關行爲污染子類。完成了策略封裝和可替換性。

 

 (六)工廠模式

 應用場景:工廠方式建立類的實例,多與proxy模式配合,建立可替換代理類。

 優點:易於替換,面向抽象編程,application只與抽象工廠和易變類的共性抽象類發生調用關係。

 敏捷原則:DIP依賴倒置原則

 實例:項目部署環境中依賴多個不一樣類型的數據庫時,須要使用工廠配合proxy完成易用性替換

 注意事項:項目初期,軟件結構和需求都沒有穩定下來時,不建議使用此模式,由於其劣勢也很明顯,

 增 加了代碼的複雜度,增長了調用層次,增長了內存負擔。因此要注意防止模式的濫用。

 

 

.框架

1.SDWebimage

1> SDWebimage的緩存機制

  1. UIImageView+WebCache: setImageWithURL:placeholderImage:options: 先顯示 placeholderImage ,同時由SDWebImageManager 根據 URL 來在本地查找圖片。
  2. SDWebImageManager: downloadWithURL:delegate:options:userInfo: SDWebImageManager是將UIImageView+WebCache同SDImageCache連接起來的類, SDImageCache: queryDiskCacheForKey:delegate:userInfo:用來從緩存根據CacheKey查找圖片是否已經在緩存中
  3. 若是內存中已經有圖片緩存, SDWebImageManager會回調SDImageCacheDelegate : imageCache:didFindImage:forKey:userInfo:
  4. 而 UIImageView+WebCache 則回調SDWebImageManagerDelegate:  webImageManager:didFinishWithImage:來顯示圖片。
  5. 若是內存中沒有圖片緩存,那麼生成 NSInvocationOperation 添加到隊列,從硬盤查找圖片是否已被下載緩存。
  6. 根據 URLKey 在硬盤緩存目錄下嘗試讀取圖片文件。這一步是在 NSOperation 進行的操做,因此回主線程進行結果回調 
  7. notifyDelegate:
  8. 若是上一操做從硬盤讀取到了圖片,將圖片添加到內存緩存中(若是空閒內存太小,會先清空內存緩存)。SDImageCacheDelegate 回調 imageCache:didFindImage:forKey:userInfo:進而回調展現圖片。
  9. 若是從硬盤緩存目錄讀取不到圖片,說明全部緩存都不存在該圖片,須要下載圖片,回調 
  10. imageCache:didNotFindImageForKey:userInfo:
  11. 共享或從新生成一個下載器 SDWebImageDownloader 開始下載圖片。
  12. 圖片下載由 NSURLConnection 來作,實現相關 delegate 來判斷圖片下載中、下載完成和下載失敗。
  13. connection:didReceiveData: 中利用 ImageIO 作了按圖片下載進度加載效果。
  14. connectionDidFinishLoading: 數據下載完成後交給 SDWebImageDecoder 作圖片解碼處理。
  15. 圖片解碼處理在一個 NSOperationQueue 完成,不會拖慢主線程 UI。若是有須要對下載的圖片進行二次處理,最好也在這裏完成,效率會好不少。
  16. 在主線程 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo: 回調給 SDWebImageDownloader。
  17. imageDownloader:didFinishWithImage: 回調給 SDWebImageManager 告知圖片下載完成。
  18. 通知全部的 downloadDelegates 下載完成,回調給須要的地方展現圖片。
  19. 將圖片保存到 SDImageCache 中,內存緩存和硬盤緩存同時保存。
  20. 寫文件到硬盤在單獨 NSInvocationOperation 中完成,避免拖慢主線程。
  21.  若是是在iOS上運行,SDImageCache 在初始化的時候會註冊notification 到 UIApplicationDidReceiveMemoryWarningNotification 以及  UIApplicationWillTerminateNotification,在內存警告的時候清理內存圖片緩存,應用結束的時候清理過時圖片。
  22. SDWebImagePrefetcher 能夠預先下載圖片,方便後續使用。

 

位運算

NSCache

特色: a> 線程安全的 b> 當內存不足的時候,自動釋放 c> 緩存數量和緩存成本

區別NSMutableDictionary

1> 不能也不該該遍歷  2> NSCache對key強引用,NSMutableDictionary對key進行copy

 

2.AFN

1>實現原理

AFN的直接操做對象AFHTTPClient不一樣於ASI,是一個實現了NSCoding和NSCopying協議的NSObject子類。 AFHTTPClient是一個封裝了一系列操做方法的「工具類」,處理請求的操做類是一系列單獨的,基於NSOperation封裝 的,AFURLConnectionOperation的子類。AFN的示例代碼中經過一個靜態方法,使用dispatch_once()的方式建立 AFHTTPClient的共享實例,這也是官方建議的使用方法。在建立AFHTTPClient的初始化方法中,建立了OperationQueue並 設置一系列參數默認值。在getPath:parameters:success:failure方法中建立NSURLRequest,以 NSURLRequest對象實例做爲參數,建立一個NSOperation,並加入在初始化發方中建立的NSOperationQueue。以上操做都 是在主線程中完成的。在NSOperation的start方法中,以此前建立的NSURLRequest對象爲參數建立NSURLConnection 並開啓連結。

2> 傳遞指針 如何使一個方法返回多個返回值

 

 

.項目

3.混編

arc mrc混編

c c++混編

4.加密

 

.算法

交換數值的幾種方法  中間變量  加減法   異或

二叉樹

鏈表

遞歸

相關文章
相關標籤/搜索