你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發根本功的那些事兒(未完待續)

iOS開發根本功的那些事兒(未完待續)

編輯:IOS開發綜合

Objc

一.三大特性

1.封裝_點語法

2.承繼

3.多態

1> 什麼是多態

多態:不同對象以自己的方式呼應相反的音訊的才能叫做多態。

由於每個類都屬於該類的名字空間,這使得多態稱為能夠。類定義中的名字和類定義外的名字並不會抵觸。類的實例變量和類辦法有如下特點:

和C言語中構造體中的數據成員一樣,類的實例變量也位於該類獨有的名字空間。 類辦法也異樣位於該類獨有的名字空間。與C言語中的辦法名不同,類的辦法名並不是一個全局符號。一個類中的辦法名不會和其他類中異樣的辦法名抵觸。兩個完全不同的類可以完成同一個辦法。 辦法名是對象接口的一局部。對象收到的音訊的名字就是調用的辦法的名字。由於不同的對象可以有同名的辦法,所以對象必需能了解音訊的含義。異樣的音訊發給不同的對象,招致的操作並不相反。

多態的次要益處就是簡化了編程接口。它允許在類和類之間重用一些習氣性的命名,而不必為每一個新加的函數命名一個新名字。這樣,編程接口就是一些籠統的行為的集合,從而和完成接口的類區分開來。

Objective-C支持辦法名的多態,但不支持參數和操作符的多態。

2>OC中如何完成多態

在Objective-C中是經過一個叫做selector的選取器完成的。在Objective-C中,selector有兩個意思, 當用在給對象的源碼音訊時,用來指辦法的名字。它也指那個在源碼編譯後替代辦法名的獨一的標識符。 編譯後的選擇器的類型是SEL有異樣名字的辦法、也有異樣的選擇器。你可以運用選擇器來調用一個對象的辦法。

選取器有以下特點:

* 一切同名的辦法擁有異樣的選取器

* 一切的選取器都是不一樣的

(1) SEL和@selector

選擇器的類型是SEL。@selector指示符用來援用選擇器,前往類型是SEL。

例如:

SELresponseSEL;

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.NSArray和NSDictionary

1> IOS遍歷數組/字典的辦法

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

字典:

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

2. for(idakey 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> 歸檔視圖尺寸,坐標


4.其他

nil Nil null NSNull 的區別


四.關鍵字

1.@property

1>readwrite,readonly,assign,retain,copy,nonatomic屬性的作用

@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> mutablecopy和copy@property(copy) NSMutableArray *arr;這樣寫有什麼問題

mutablecopy前往可變對象,copy前往不可變對象

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

完成<NSCopying>協議,重寫copyWithZone辦法


五.runtime/音訊轉發機制

1.runtimehttp://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_copyPropertyListclass_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 isasuper 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 代碼中做任何任務,就可以自動獲取靜態綁定的益處。您在每次發送音訊時,特別是當音訊的接納者是靜態類型曾經確定的對象時,靜態綁定就會例行而通明地發作。


5>告訴的內存管理 線程問題



六.內存管理

1.內存區域

1>堆和棧的區別

管理方式:關於棧來講,是由編譯器自動管理,無需我們手工控制;關於堆來說,釋放任務由順序員控制,容易發生memory leak。

請求大小:

棧:在Windows下,棧是向低地址擴展的數據構造,是一塊延續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是零碎事後規則好的,在 WinDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),假如請求的空間超越棧的剩余空間時,將提示overflow。因而,能從棧取得的空間較小。

堆:堆是向窪地址擴展的數據構造,是不延續的內存區域。這是由於零碎是用鏈表來存儲的閒暇內存地址的,自然是不延續的,而鏈表的遍歷方向是由低地址向窪地址。堆的大小受限於計算機零碎中無效的虛擬內存。由此可見,堆取得的空間比擬靈敏,也比擬大。

碎片問題:

關於堆來講,頻繁的new/delete勢必會形成內存空間的不延續,從而形成少量的碎片,使順序效率降低。關於棧來講,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的逐個對應,以致於永遠都不能夠有一個內存塊從棧兩頭彈出

分配方式:

堆都是靜態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和靜態分配。靜態分配是編譯器完成的,比方部分變量的分配。靜態分配由alloca函數停止分配,但是棧的靜態分配和堆是不同的,他的靜態分配是由編譯器停止釋放,無需我們手工完成。

分配效率:

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

2.IOS內存管理

1> 字符串的內存管理

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

2> 循環援用

delegate屬性的內存戰略

block循環援用實踐場景

3> autorelease的運用 工廠辦法為什麼不釋放對象ARC下autorelease的運用場景

防止內存峰值

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> OC和C框架對象援用

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.KVC和KVO

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>什麼是KVC和KVO

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> frame和bounds的區別

frame:可表示尺寸和地位,與父視圖坐標系的關系,地位以自己的左上角為原點,可用於形變和位移

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

center:只表示地位,表示自己中心的坐標,可用於位移

2>trasform

修正位移\形變\旋轉,transform不同於board\center\frame,前者中記載的是形變的數據,不發作形變其值是空的,所以我們需求新建構造體,用CGAff.netransform(仿射變換)函數給對象構造體屬性賦值,然後者是控件的固有屬性,內存數據是一直存在的,當我們用他們做挪動等操作時,是改動其值,所以是構造體賦值三步曲,不必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類的注冊:

- (void)registerClass:forCellWithReuseIdentifier:- (void)registerClass:forSupplementaryViewOfKind:withReuseIdentifier:- (void)registerNib:forCellWithReuseIdentifier: 2)collectionView與tableView最大的不同點,collectionView必需要運用自己的layout(UICollectionViewLayout)

如:

UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
flowLayout.itemSize = CGSizeMake(52, 52);// cell大小
flowLayout.minimumInteritemSpacing = 1;// cell間距
flowLayout.minimumLineSpacing = 1; // cell行距
flowLayout.sectionInset = (UIEdgeInsets){81,1,1,1};// cell邊距 創立collectionView需求帶Layout的初始化辦法:

- (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 當順序將要加入是被調用,通常是用來保管數據和一些加入前的清算任務。

iOS開發基本功的那些事兒(未完待續)

第一次握手:樹立銜接時,客戶端發送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>TCP與UDP的區別:

3.1>基於銜接與無銜接;

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

3.3>UDP順序構造較復雜;

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

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


4>http和scoket通訊的區別

http是客戶端用http協議停止懇求,發送懇求時分需求封裝http懇求頭,並綁定懇求的數據,服務器普通有web服務器配合(當然也非相對)。 http懇求方式為客戶端自動發起懇求,服務器才干給呼應,一次懇求終了後則斷開銜接,以節省資源。服務器不能自動給客戶端呼應(除非采取http長銜接技術)。iPhone次要運用類是NSUrlConnection。

scoket是客戶端跟服務器直接運用socket“套接字”停止銜接,並沒有規則銜接後斷開,所以客戶端和服務器可以堅持銜接通道,單方都可以自動發送數據。普通在游戲開發或股票開發這種要求即時性很強並且堅持發送數據量比擬大的場所運用。次要運用類是CFSocketRef。


3.網絡傳輸

1>DNS是如何任務的

DNS是domain name server的簡稱,每個網絡的計算機都有ip,但是不好記,所以用域名替代(如www.baidu.com),在 Inte.net 上真真實辨識機器的還是 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 XmlRss/ target=_blank class=infotextkey>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.webViewstringByEvaLuatingJavaScriptFromString:“Window.location.href = xxx”];

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

運用辦法截取重定向

(BOOL)webView:(UIWebView*)webViewshouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType:(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> Swift和OC的區別

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的緩存機制

UIImageView+WebCache: setImageWithURL:placeholderImage:options: 先顯示 placeholderImage ,同時由SDWebImageManager 依據 URL 來在本地查找圖片。SDWebImageManager: downloadWithURL:delegate:options:userInfo: SDWebImageManager是將UIImageView+WebCache同SDImageCache鏈接起來的類,SDImageCache: queryDiskCacheForKey:delegate:userInfo:用來從緩存依據CacheKey查找圖片能否曾經在緩存中假如內存中曾經有圖片緩存,SDWebImageManager會回調SDImageCacheDelegate : imageCache:didFindImage:forKey:userInfo:而 UIImageView+WebCache 則回調SDWebImageManagerDelegate: webImageManager:didFinishWithImage:來顯示圖片。假如內存中沒有圖片緩存,那麼生成 NSInvocationOperation 添加到隊列,從硬盤查找圖片能否已被下載緩存。依據 URLKey 在硬盤緩存目錄下嘗試讀取圖片文件。這一步是在 NSOperation 停止的操作,所以回主線程停止後果回調
notifyDelegate:
假如上一操作從硬盤讀取到了圖片,將圖片添加到內存緩存中(假如閒暇內存過小,會先清空內存緩存)。SDImageCacheDelegate 回調 imageCache:didFindImage:forKey:userInfo:進而回調展現圖片。假如從硬盤緩存目錄讀取不到圖片,闡明一切緩存都不存在該圖片,需求下載圖片,回調
imageCache:didNotFindImageForKey:userInfo:
共享或重重生成一個下載器 SDWebImageDownloader 開端下載圖片。圖片下載由 NSURLConnection 來做,完成相關 delegate 來判別圖片下載中、下載完成和下載失敗。connection:didReceiveData: 中應用 ImageIO 做了按圖片下載進度加載效果。connectionDidFinishLoading: 數據下載完成後交給 SDWebImageDecoder 做圖片解碼處置。圖片解碼處置在一個 NSOperationQueue 完成,不會拖慢主線程 UI。假如有需求對下載的圖片停止二次處置,最好也在這裡完成,效率會好很多。在主線程 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo: 回調給 SDWebImageDownloader。imageDownloader:didFinishWithImage: 回調給 SDWebImageManager 告知圖片下載完成。告訴一切的 downloadDelegates 下載完成,回調給需求的中央展現圖片。將圖片保管到 SDImageCache 中,內存緩存和硬盤緩存同時保管。寫文件到硬盤在獨自 NSInvocationOperation 中完成,防止拖慢主線程。假如是在iOS上運轉,SDImageCache 在初始化的時分會注冊notification 到UIApplicationDidReceiveMemoryWarningNotification 以及UIApplicationWillTerminateNotification,在內存正告的時分清算內存圖片緩存,使用完畢的時分清算過時圖片。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> 傳遞指針 如何使一個辦法前往多個前往值



七.項目

1.編譯鏈接


2.靜態庫

如何給靜態庫添加屬性 分類+runtime

如何調用公有辦法performselectorcategory(前向援用)


3.混編

arc mrc混編

c c++混編


4.加密


5.iOS更新

ios 8 9 10的區別


5.日期處置

字符串操作appendformatsubstringrangeofstring nsrangehttp://www.cnblogs.com/neworiginou/archive/2012/11/14/2770038.html


八.算法

交流數值的幾種辦法兩頭變量加減法 異或

二叉樹

鏈表

遞歸

【iOS開發根本功的那些事兒(未完待續)】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved