国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS 面試題

2019-11-06 09:45:21
字體:
來源:轉載
供稿:網友
● OC語言特點:繼承、多態、封裝1、是面向對象的設計語言2、僅支持單一父類繼承,不支持多重繼承跳出面向對象思想()多態      多態:不同對象以自己的方式響應相同的消息的能力叫做多態。 (自我理解:不同的類可以有相同的屬性、方法)跳出面向對象思想()繼承繼承是罪惡,盡量不要繼承。(避免:拔出蘿卜帶出泥)就我目前了解到的情況看,除了安居客的Pad App沒有在框架級針對UIViewController有繼承的設計以外,其它公司或多或少都針對UIViewController有繼承,包括安居客iphone app(那時候我已經對此無能為力,可見View的架構在一開始就設計好有多么重要)。甚至有的還對UITableView有繼承,這是一件多么令人發指,多么慘絕人寰,多么喪心病狂的事情啊。雖然不可避免的是有些情況我們不得不從蘋果原生對象中繼承,比如UITableViewCell。但我還是建議盡量不要通過繼承的方案來給原生對象添加功能,前面提到的aspect方案和Category方案都可以使用。用Aspect+load來實現重載函數,用Category來實現添加函數,當然,耍點手段用Category來添加PRoperty也是沒問題的。這些方案已經覆蓋了繼承的全部功能,而且非常好維護,對于業務方也更加透明,何樂而不為呢。不用繼承可能在思路上不會那么直觀,但是對于不使用繼承帶來的好處是足夠頂得上使用繼承的壞處的。順便在此我要給Category正一下名:業界對于Category的態度比較曖昧,在多種場合(講座、資料文檔)都宣揚過盡可能不要使用Category。它們說的都有一定道理,但我認為Category是蘋果提供的最好的使用集合代替繼承的方案,但針對Category的設計對架構師的要求也很高,請合理使用。而且蘋果也在很多場合使用Category,來把一個原本可能很大的對象,根據不同場景拆分成不同的Category,從而提高可維護性。不使用繼承的好處我在這里已經說了,放到iOS應用架構來看,還能再多額外兩個好處:1.在業務方做業務開發或者做Demo時,可以脫離App環境,或花更少的時間搭建環境。2.對業務方來說功能更加透明,也符合業務方在開發時的第一直覺。OC、C的區別:C是面向過程的設計語言OC、C++的區別:都是面向對象的設計語言,1、繼承:OC不支持多重繼承,而C++語言支持多重繼承(多重繼承的效率不高);2、函數調用:OC通過互相傳遞消息實現函數調用,而C++直接進行函數調用3、接口:OC采用protocol協議(非正式和正式)的形式來定義接口,而C++采用虛函數的形式來定義接口。Object-C的優點、缺點 objc優點:   1) Cateogies   2) Posing   3)動態識別   4)指標計算   5)彈性訊息傳遞   6)不是一個過度復雜的C衍生語言   7) Objective-C與C++可混合編程 缺點:   1) 不支援命名空間   2)  不支持運算符重載   3)不支持多重繼承   4)使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。 多重繼承:指的是一個類可以同時繼承多個父類的行為和特征功能。copy與retain: retain 相當于 strong1、copy其實是建立了一個相同的對象,而retain不是;2、copy是內容拷貝,retain是指針拷貝;  3、copy是內容的拷貝,對于像NSString,的確是這樣,但是如果copy的是一個NSArray呢?這時只是copy了指向array中相對應元素的指針.這便是所謂的"淺復制".4、copy的情況:NSString *newPt = [pt copy];此時會在堆上重新開辟一段內存存放@"abc"比如0X1122內容為@"abc同時會在棧上為newPt分配空間比如地址:0Xaacc內容為0X1122因此retainCount增加1供newPt來管理0X1122這段內存;assign與retain:1、assign:簡單賦值,不更改索引計數;2、assign的情況:NSString *newPt = [pt assing]; 此時newPt和pt完全相同地址都是0Xaaaa內容為0X1111即newPt只是pt的別名,對任何一個操作就等于對另一個操作,因此retainCount不需要增加;3、assign就是直接賦值;4、retain使用了引用計數,retain引起引用計數加1, release引起引用計數減1,當引用計數為0時,dealloc函數被調用,內存被回收;    5、retain的情況:NSString *newPt = [pt retain]; 此時newPt的地址不再為0Xaaaa,可能為0Xaabb但是內容依然為0X1111。因此newPt和pt都可以管理"abc"所在的內存,因此retainCount需要增加1 ;readonly:屬性是只讀的,默認的標記是讀寫,如果你指定了只讀,在@implementation中只需要一個讀取器。或者如果你使用@synthesize關鍵字,也是有讀取器方法被解析  readwrite:說明屬性會被當成讀寫的,這也是默認屬性。設置器和讀取器都需要在@implementation中實現。如果使用@synthesize關鍵字,讀取器和設置器都會被解析;nonatomic:非原子性訪問,對屬性賦值的時候不加鎖,多線程并發訪問會提高性能。如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問;weak and strong property (強引用和弱引用的區別):1、 weak和strong屬性只有在你打開ARC時才會被要求使用,這時你是不能使用retain release autorelease操作的,因為ARC會自動為你做好這些操作,但是你需要在對象屬性上使用weak和strong,其中strong就相當于retain屬性,而weak相當于assign。2、只有一種情況你需要使用weak(默認是strong),就是為了避免retain cycles(就是父類中含有子類{父類retain了子類},子類中又調用了父類{子類又retain了父類},這樣都無法release)    3、聲明為weak的指針,指針指向的地址一旦被釋放,這些指針都將被賦值為nil。這樣的好處能有效的防止野指針。    ARC(Automatic Reference Counting):就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內存管理的引用計數的代碼可以自動地由編譯器完成了。該機能在iOS 5/ Mac OS X 10.7開始導入,利用Xcode4.2以后可以使用該特性。strong,weak,copy具體用法:1.具體一點:IBOutlet可以為weak,NSString為copy,Delegate一般為weak,其他的看情況。一般來說,類“內部”的屬性設置為strong,類“外部”的屬性設置為weak。說到底就是一個歸屬權的問題。小心出現循環引用導致內存無法釋放。2.不用ARC的話就會看到很多retian。3.如果你寫了@synthesize abc = _abc;的話,系統自動幫你聲明了一個_abc的實例變量。  使用assign:對基礎數據類型(NSInteger)和C數據類型(int, float, double, char,等)  使用copy:對NSString  使用retain:對其他NSObject和其子類 property簡短的代碼更易讀:_property的寫法比self.property更短,也更簡單。我認為這樣寫出來的代碼更方便閱讀。執行速度更快,IPA體積更小我之前從來沒想到過這兩者之間的速度和應用體積會有很大差別。不過一個同行(來自國外著名的社交網絡公司)告訴我,他們公司發現二者還是有不小的差距,如果你們的應用需要做一些深度優化,可以考慮一下把self.property換成_property。但我覺得,大部分應用都應該是不需要做這種深度優化的。循環引用問題微博上的@王_曉磊在評論中提到:直接用私有變量有個需要特別注意的地方,在 block 里直接寫_property相當于self->_property,雖然沒寫 self,但是暗含了對 self 的retain,容易造成循環引用。要記得用 weakSelf/strongSelf 大法。淺復制和深復制的區別?shallow copy and deep copy答案:淺層復制:只復制指向對象的指針,而不復制引用對象本身。  深層復制:復制引用對象本身。用網上一哥們通俗的話將就是:淺復制好比你和你的影子,你完蛋,你的影子也完蛋深復制好比你和你的克隆人,你完蛋,你的克隆人還活著。iOS 進程、線程 及 堆、棧關系的總結簡而言之,一個程序至少有一個進程,一個進程至少有一個線程. 多線程線程是可執行代碼的可分派單元。這個名稱來源于“執行的線索”的概念。在基于線程的多任務的環境中,所有進程有至少一個線程,但是它們可以具有多個任務。這意味著單個程序可以并發執行兩個或者多個任務。簡而言之,線程就是把一個進程分為很多片,每一片都可以是一個獨立的流程。這已經明顯不同于多進程了,進程是一個拷貝的流程,而線程只是把一條河流截成很多條小溪。它沒有拷貝這些額外的開銷,但是僅僅是現存的一條河流,就被多線程技術幾乎無開銷地轉成很多條小流程,它的偉大就在于它少之又少的系統開銷。(當然偉大的后面又引發了重入性等種種問題,這個后面慢慢比較)。 堆和棧的區別 管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產生memory leak。 申請大小: 棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。 堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。 碎片問題:對于堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。        對于棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個內存塊從棧中間        彈出 分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。 分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很復雜的。堆和棧的區別一、預備知識—程序的內存分配一個由c/C++編譯的程序占用的內存分為以下幾個部分:1、棧區(stack)由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。2、堆區(heap)一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表。3、全局區(靜態區)(static),全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 - 程序結束后由系統釋放。4、文字常量區:常量字符串就是放在這里的。程序結束后由系統釋放。5、程序代碼區:存放函數體的二進制代碼。堆和棧上的指針 指針所指向的這塊內存是在哪里分配的,在堆上稱為堆上的指針,在棧上為棧上的指針. 在堆上的指針,可以保存在全局數據結構中,供不同函數使用訪問同一塊內存. 在棧上的指針,在函數退出后,該內存即不可訪問. 什么是指針的釋放? 具體來說包括兩個概念. 1釋放該指針指向的內存,只有堆上的內存才需要我們手工釋放,棧上不需要. 2將該指針重定向為NULL. 數據結構中的指針? 其實就是指向一塊內存的地址,通過指針傳遞,可實現復雜的內存訪問. 函數指針? 指向一塊函數的入口地址. 指針作為函數的參數? 比如指向一個復雜數據結構的指針作為函數變量 這種方法避免整個復雜數據類型內存的壓棧出棧操作,提高效率. 注意:指針本身不可變,但指針指向的數據結構可以改變. 指向指針的指針? 指針指向的變量是一個指針,即具體內容為一個指針的值,是一個地址. 此時指針指向的變量長度也是4位. 指針與地址的區別? 1指針意味著已經有一個指針變量存在,他的值是一個地址,指針變量本身也存放在一個長度為四個字節的地址當中,而地址概念本身并不代表有任何變量存在. 2指針的值,如果沒有限制,通常是可以變化的,也可以指向另外一個地址.    地址表示內存空間的一個位置點,他是用來賦給指針的,地址本身是沒有大小概念,指針指向變量的大小,取決于地址后面存放的變量類型. 指針與數組名的關系?   其值都是一個地址,但前者是可以移動的,后者是不可變的. 怎樣防止指針的越界使用問題?   必須讓指針指向一個有效的內存地址, 1防止數組越界 2防止向一塊內存中拷貝過多的內容 3防止使用空指針 4防止改變const修改的指針 5防止改變指向靜態存儲區的內容 6防止兩次釋放一個指針 7防止使用野指針. 全局變量和局部變量在內存中是否有區別?如果有,是什么區別?           全局變量儲存在靜態數據庫, 局部變量在堆棧。堆棧溢出一般是由什么原因導致的?沒有回收垃圾資源什么函數不能聲明為虛函數?            constructor什么是平衡二叉樹?           左右子樹都是平衡二叉樹且左右子樹的深度差值的絕對值不大于1static 關鍵字的作用: (1)函數體內static變量的作用范圍為該函數體,不同于auto變量,該變量的內存只被分配一次, 因此其值在下次調用時仍維持上次的值; (2)在模塊內的static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問; (3)在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模塊內; (4)在類中的static成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝; (5)在類中的static成員函數屬于整個類所擁有,這個函數不接收this指針,因而只能訪問類的static成員變量。  單例類:Singleton單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例。1.單例模式的要點:要點有三個一是: 某個類只能有一個實例;二是: 它必須自行創建這個實例;三是: 它必須自行向整個系統提供這個實例。2.單例模式的優點:   1.實例控制:Singleton 會阻止其他對象實例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實例。2.靈活性:因為類控制了實例化過程,所以類可以更加靈活修改實例化過程 IOS中的單例模式  在oc中要實現一個單例類,至少需要做以下四個步驟:   1、為單例對象創建一個靜態實例,并初始化,然后設置成nil,  2、實現一個實例構造方法,檢查聲明的靜態實例是否為nil,如果是則新建,并返回一個本類的實例,  3、重寫 allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實例的時候不產生一個新實例,4、適當實現 allocWithZone,copyWithZone,release和autorelease。                                                                                                        + (Singleton *)singleton{    static Singleton *instance = nil;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        instance = [[self alloc] init];    });    return instance;}官方推薦://1. Apple官方推薦的單例寫法,這種能夠保證多線程的情況下只有一個對象//2. dispatch_once  這個block中得方法,只會執行一次工廠方法模式 /**  * 如何理解三種設計模式:簡單工廠、工廠方法、抽象工廠? 1、簡述首先需要說明一下,簡單工廠模式不屬于23種GOF設計模式之一。它也稱作靜態工作方法模式,是工廠方法模式的特殊實現(也就是說工廠模式包含簡單工廠模式)。這里對簡單工廠模式進行介紹,是為后面的工廠方法和抽象工廠模式做一個引子。 2、定義“專門定義一個類來負責創建其他類的實例,被創建的實例通常具有共同的父類。”實際上就是由一個工廠類,根據傳入的參數,動態地決定創建出哪一個產品類的實例。GOF是這樣描述工廠模式的:在基類中定義創建對象的一個接口,讓子類決定實例化哪個類。工廠方法讓一個類的實例化延遲到子類中進行。        工廠方法要解決的問題是對象的創建時機,它提供了一種擴展的策略,很好地符合了開放封閉原則。工廠方法也叫做虛構造器(Virtual Constructor). */你平時自定義過那些視圖控件UITapBarController、UItableViewCell、UIview、Button因為系統的一些控件不能滿足項目的需求,這時需要我們自定義控件SVN代碼版本控制器,方便管理代碼(通過時間判定來不斷保存每個時間段里被修改的代碼,可用于幫助2-3人整合代碼,集中式),分布式用到git,現在的Xcode支持gitup功能GCD蘋果公司的開發技術。推薦使用。線程幾種方式  NSThread  NSOperation  GCD好處與工作原理1.Thread :是三種方法里面相對輕量級的,但需要管理線程的生命周期、同步、加鎖問題,這會導致一定的性能開銷2.Cocoa Operations:是基于OC實現的,NSOperation以面向對象的方式封裝了需要執行的操作,不必關心線程管理、同步等問題。NSOperation是一個抽象基類,iOS提供了兩種默認實現:NSInvocationOperation和NSBlockOperation,當然也可以自定義NSOperation3.Grand Central Dispatch(簡稱GCD,iOS4才開始支持):提供了一些新特性、運行庫來支持多核并行編程,它的關注點更高:如何在多個cpu上提升效率GCD1.用于解決多核并行運算的問題,可以平行操作更多的任務,會自動管理線程的生存周期2.它們都允許程序將任務切分為多個單一任務然后提交至工作隊列來并發地或者串行地執行,但GCD比之NSOpertionQueue更底層更高效3.工作原理:讓程序平行排隊的任務,在任何可用的處理器核心上執行任務。?一個任務可以是一個函數(function)或者是一個block。 4.GCD的底層依然是用線程實現,不過這樣可以讓程序員不用關注實現的細節。?GCD中的FIFO隊列稱為dispatch queue,它可以保證先進來的任務先得到執行. 使用GCD的好處和注意事項:1.通過使用GCD可以高效的利用處理器多核運算的能力2.繁雜耗時較長的計算任務可以通過GCD分配給其他線程來完成任務.3.如果沒有特殊需求,不應引入線程增加程序復雜度4.謹慎對待線程阻塞. 理解Dispatch Queue(調度列隊):Dispatch Queue分為下面三種:?1.串行隊列Serial Queue   它們各自是同步執行的(一般很少用到)?2.并行隊列:dispatch global queue,可以并發地執行多個任務,但是執行完成的順序是隨機的。?3.主隊列Main queue它是全局可用的serial queue,它是在應用程序主線程上執行任務的。UI層面的更新都必須通過主線程來執行,否則會出現很多無法預估的問題. 什么時候創建多線程:當主線程中有比較大的耗時的任務時,該任務會阻塞主線程,這時就可以開辟一條新線程。 //從其他線程回到主線程的方法    // NSThread    [self performSelectorOnMainThread:@selector(run)withObject:nilwaitUntilDone:NO];    // GCD    dispatch_async(dispatch_get_main_queue(), ^{    });       // NSOperationQueue    [[NSOperationQueue mainQueue] addOperationWithBlock:^{    }];MVCMVC設計模式考慮三種對象:模型對象、視圖對象和控制器對象。Modal、View、Controller模型對象:負責保有應用程序的數據和定義操作數據的邏輯。                 --->處理數據視圖對象:知道如何顯示應用程序的模型數據,而且可能允許用戶對其進行編輯。--->顯示數據、用戶編輯數據控制器對象:是應用程序的視圖對象和模型對象之間的協調者。               --->模型和視圖的協調著特性: 1.提高代碼的復用性2.結構清晰便于維護3.在低內存可用的設備上,由于modal和view的分離,便于節省內存開銷 模態視圖已經淘汰了,但是為了滿足項目的需求我平時只使用過模態視圖,來處理一個簡單的視圖,比如彈出:詳情頁面、選照片頁面等KVC全稱是Key-value coding,鍵值編碼。使用字符串來標識屬性,是間接訪問對象的屬性, 而不是通過調用存取方法。特點: 可以簡化程序代碼。 KVO全稱Key-value observing,鍵值觀察。提供了一種當其它對象屬性被修改時通知當前對象的機制。在MVC大行其道的Cocoa中,KVO機制很適合實現model和controller類之間的通訊。特點:他提供了觀察某一屬性變化的方法,極大的簡化了代碼。,比方說根據A(數據類)的某個屬性值變化,B(view類)中的某個屬性做出相應變化。對于推崇MVC的cocoa而言,kvo應用的地方非常廣泛。(這樣的機制聽起來類似Notification,但是notification是需要一個發送notification的對象,一般是notificationCenter,來通知觀察者。而kvo是直接通知到觀察對象。1 注冊:-(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)contextkeyPath就是要觀察的屬性值,options給你觀察鍵值變化的選擇,而context方便傳輸你需要的數據(注意這是一個void型)2 實現變化方法:-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object  change:(NSDictionary *)change context:(void *)contextchange里存儲了一些變化的數據,比如變化前的數據,變化后的數據;如果注冊時context不為空,這里context就能接收到。  BLOCK可以說是一個代碼段,可以實現指定的功能,指向一段代碼的內存地址。1.能夠讀取其它函數內部的變量。2.相當于簡單地實現了代理。3. block配合上dispatch_queue,可以方便地實現簡單的多線程編程和異步編程,一個block實際是一個對象4.創建、描述功能、調用作為方法的參數(method parameter)- (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName;作為方法參數的時候被調用[someObject someMethodThatTakesABlock: ^returnType (parameters) {...}];Notification消息的發送者 告知 接收者事件已經發生或者將要發送,僅此而已,接收者不能影響:發送者的行為。 Delegate代理的目的是改變或傳遞控制鏈。可以減少框架復雜度。消息的發送者(sender)告知接收者(receiver)某個事件將要發生,delegate同意,然后發送者響應事件發送者 委托  接收者 去做莫件事delegate機制使得接收者可以改變發送者的行為。通常發送者和接收者的關系是直接的 一對多 的關系。 什么時候用Delegate,什么時候用Notification?答:Delegate:針對   一對一  的關系,并且reciever可以返回值 給sender。Notification:可以針對一對一/多/無    ,reciever無法返回值給sender.所以,delegate用于sender希望接受到 reciever的某個功能反饋值,notification用于通知多個object某個事件。 自動釋放池是什么,如何工作       當您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。 1.  OC是通過一種"retainCount"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數為一,以后每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變為了0, 就會被系統銷毀. 2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的. 3. autorelease和release沒什么區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一. Socket  提供了網絡通信的能力     套接字,提供一套可用的用戶接口。實質并不是一種協議,沒有規定計算機應當怎么樣傳遞消息,只是給程序員提供了一個發送消息的接口,程序員使用這個接口提供的方法,發送與接受消息。可以和服務器處于長時間連接狀態,等待過程中發送包Socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。對TCP/IP進行封裝,方便用戶使用,及時交互,一旦連接就一直通信。每隔一段時間發送一個心跳包檢測。1)Socket是一個針對TCP和UDP編程的接口,你可以借助它建立TCP連接等等。而TCP和UDP協議屬于傳輸層 。?  而http是個應用層的協議,它實際上也建立在TCP協議之上。  (HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。) 2)Socket是對TCP/IP協議的封裝,是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。IP網絡層相當于導航關于TCP和IP:IP是網絡層的協議,TCP是傳輸層的協議。它們一起把封裝好的數據發送到想要傳送到的地址,TCP好比一個司機,IP來導航;TCP傳輸層傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之后才能傳輸數據。一個TCP連接必須要經過三次“對話”才能建立起來。HTTP:應用層          超文本傳送協議 定義了瀏覽器(即萬維網客戶進程)怎樣向萬維網服務器請求萬維網文檔,以及服務器怎樣把文檔傳送給瀏覽器。從層次的角度看,HTTP是面向(transaction-oriented)應用層協議,它是萬維網上能夠可靠地交換文件(包括文本、聲音、圖像等各種多媒體文件)的重要基礎。HTTP是一個屬于應用層的面向對象的協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。相應的還有FTP應用層,以前用以局域網內使用,現在很少使用;TELNET用以發送郵件 UDP:傳輸層    非面向對象連接     只管發送,不管接受。優點是效率高(用在即時通訊,如QQ),缺點:易丟包)用戶數據包協議,在網絡中它與TCP協議一樣用于處理數據包,是一種無連接的協議。在OSI模型中,在第四層——傳輸層,處于IP協議的上一層。UDP有不提供數據包分組、組裝和不能對數據包進行排序的缺點,也就是說,當報文發送之后,是無法得知其是否安全完整到達的。UDP用來支持那些需要在計算機之間傳輸數據的網絡應用。包括網絡視頻會議系統在內的眾多的客戶/服務器模式的網絡應用都需要使用UDP協議。UDP協議從問世至今已經被使用了很多年,雖然其最初的光彩已經被一些類似協議所掩蓋,但是即使是在今天UDP仍然不失為一項非常實用和可行的網絡傳輸層協議。UDP協議的主要作用是:  將網絡數據流量壓縮成數據包的形式。一個典型的數據包就是一個二進制數據的傳輸單位。每一個數據包的前8個字節用來包含報頭信息,剩余字節則用來包含具體的傳輸數據。  TCP(Transmission Control Protocol,傳輸控制協議)是基于連接的協議,也就是說,在正式收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次“對話”才能建立起來,我們來看看這三次對話的簡單過程:1.主機A向主機B發出連接請求數據包;2.主機B向主機A發送同意連接和要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工作)的數據包;3.主機A再發出一個數據包確認主機B的要求同步:“我現在就發,你接著吧!”,這是第三次對話。三次“對話”的目的是使數據包的發送和接收同步,經過三次“對話”之后,主機A才向主機B正式發送數據。HTTP協議建立連接、通訊與關閉連接全過程為解決服務器TimeWait多的問題,了解了一下TCP/IP協議的連接過程。以訪問一靜態頁面為例,從建立連接到訪問拿到數據,然后關閉的整個過程。建立連接:1. 發起請求的一方,從發送syn(遞交名片)包開始第一次握手。2. 收到請求的一方立馬回應ack包,發現這是新建連接,然后也給出自己的syn包(遞交名片)。(嚴重來講,任何一方收到對方數據之后都會回應一個ack表示自己已收到)3. 發起方收到響應后回應一個ack包。(整個過程注意sequence number的變化)4. OK。建立互信,可以開始交往!開始通訊:1. 客戶端(發起方)向服務端(應答方)發起Http請求,如圖中Packet 4 :C=GET URI=/higkoo。2. 服務端收到請求后立馬回應了ack,并告訴客戶保持連接等待傳輸數據。3. 緊接著服務端就向客戶端返回了Http響應數據。4. OK,通訊完成!關閉連接:1. 此時,到了圖中的Packet 7。客戶端收到響應數據返回了ack包并發起了關閉連接的請求。(fin包代表我要關閉)2. 服務端也真夠快,立馬就回應ack包:“好,我收到你要關閉的請求了”。3. 服務端認為可以關閉了,然后也向客戶端發起了關閉請求。(fin包)4. 客戶端立馬也回應ack包:“嗯,我們關閉吧”。5. OK,游戲結束!JsonxmlXML與HTML 的設計區別是:XML的核心是數據,其重點是數據的內容。而HTML 被設計用來顯示數據,其重點是數據的顯示。XML和HTML的語法區別:HTML的標記不是所有的都需要成對出現,XML則要求所有的標記必須成對出現;HTML標記不區分大小寫,XML則 大小敏感,即區分大小寫。解析 XML 通常有兩種方式,DOM 和 SAX:           SAX解析XML,是基于事件通知的模式,一邊讀取XML文檔一邊處理,不必等整個文檔加載完之后才采取操作,當在讀取解析過程中遇到需要處理的對象,會發出通知對其進行處理。           DOM解析XML時,讀入整個XML文檔并構建一個駐留內存的樹結構(節點樹),通過遍歷樹結構可以檢索任意XML節點,讀取它的屬性和值。而且通常情況下,可以借助XPath,直接查詢XML節點。    NSString *path=[[NSBundle mainBundle] pathForResource:@"xml" ofType:@"txt"];  NSData  *data=[NSData dataWithContentsOfFile:path];  NSXMLParser *xml=[[NSXMLParser alloc] initWithData:data];   xml.delegate=self; [xml parse]; category類別,category可以 在不獲悉,不改變原來代碼的情況下往里面:添加新的方法,只能添加,不能刪除修改。并且如果類別和原來類中的方法產生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。類別主要有3個作用:1.給現有的類增加方法, 可以增加對象方法,也可以增加靜態方法。如果增加的方法是此類本來就有的方法,那么有可能覆蓋原來的方法,也有可能不會覆蓋。2.創建對私有方法的向前引用。3.把同一類代碼,分散到不同文件中實現,如NSIndexPath,有一部分方法就是在UITableView中寫的。 類別、類擴展 的區別。? 答案category 和 extensions的不同在于后者可以添加屬性。另外后者添加的方法是必須要實現的。?extensions可以認為是一個私有的CategoryCoreAnimation(系統的庫)    //核心動畫:CAAnimation    //這個類是一個抽象類 ,不能直接創建對象    //CAPropertyAnimation       是一個抽象的子類,它支持動畫的顯示圖層的關鍵路徑中定制的屬性。    //CABasicAnimation           最基礎的動畫,簡單為圖層提供屬性修改    //CAKeyframeAnimation     關鍵幀動畫,可以指定動畫每個階段的值    //CAAnimationGroup          動畫組    //CATransition                     提供了一個圖層變化的過渡效果   //事務 CATransaction 管理線程安全的   //隱式和顯式SDWebImage原理。它會把請求到的圖片放到內存中顯示出來,同時會把圖片緩存到沙盒中。下次進入就算是斷網也會從沙盒中讀取出來。不過,這時候必須保證請求圖片的URL存在,它是根據URL尋找圖片的。 ShareSDKShareSDK用于向其他軟件分享該軟件。首先到官網去申請注冊,申請分享工具的Appkey。 ASIHTTPRequestAFNetworkingASI是基于:CFNetWork(底層通信庫),效率稍高AFNetWorking基于:NSURLConnection和NSOperationios7中2.0版本又可基于NSURLsession(與咱們熟悉的NSURLConnection是并列的)。模塊化:各種數據請求模塊化,如jsno和xml,SDWebImage類單獨分列開來。甚至plist文件也可直接獲取。靈活性:很多地方用戶可以自行擴展1.時間:AFN的第一個提交是2011年的1月1日,那個時候ASI早已是1.8+的版本了;而當AFN發布1.0版,2012年10月份的時候,ASI早早的已經停止更新了。2.用法同樣是發起一個最普通的異步請求,AFN只需要調用一個靜態方法,但代碼可讀性較差;ASI:雖然需要調用多個實例方法才能完成一次請求,但是示例看起來更清晰。3.高級功能:AFN只封裝了一些常用功能,滿足基本需求,而直接忽略了很多擴展功能。例如:AFN默認沒有封裝同步請求,如果開發者需要使用同步請求,則需要重寫getPath:parameters:success:failure方法,對AFHTTPRequestOperation進行同步處理;而ASI則是直接通過調用一個startSynchronous方法。此外AFN針對JSON、XML、PList和Image四種數據結構封裝了各自處理器,開發者可以把處理器注冊到操作隊列中,直接在回調方法中獲得格式化以后的數據。4.性能對比:文件小于12K的測試中ASI的性能優勢并沒有非常明顯,超過12K以后,ASI優勢開始明顯起來,每一次請求都要比AFN節約20% ~ 30%,近0.1秒。MKNetworkKit:一個印度人寫的,集合了兩者的優點 Base64、md5Base64是可逆的,Md5是不可逆的。Xcode,Instruments(檢測iOS應用程序內存泄露的工具),Interface Builder(開發者可以使用Interface Builder來創建和修改應用程序的圖形用戶界面。其數據以XML的形式被儲存在.xib文件中。) SBJSON                                             數據解析EGOTableViewPullRefresh              下拉刷新MBProgressHUD.SVProgressHUD  菊花FMDB:sqlite                                   數據庫EGOImageView是一種實現網絡圖片的異步加載和緩存的第三方類庫,具有相同功能的第三方類庫還有SDWebImage。但是相比兩個類庫的安裝和使用來說,EGOImageView更簡單一些XMPPFramework-master     (XMPP協議是一個可用于即時通訊的協議(比如微信的語音聊天等等)。但是基于XMPP協議寫一個即時通訊功能的App不是一件輕松的事情。這份類庫就是專門為iOS和Mac所寫的XMPP類庫,提供了一系列的接口用于寫基于XMPP的功能。這份類庫是thread-safe的,基于GCD)Bug查找 iOS可以捕獲crash日志,可以用系統提供的捕獲異常日志的類相關的方法,把捕獲的錯誤發回服務器,根據錯誤排查. SBJSON  無論是數組還是字典,都使用:objectWithString它將支持ARC//請求完成調用的方法- (void)didFinishToDo:(ASIHTTPRequest *)request{    NSLog( @“—->%@",request.responseString );    SBJSON *js = [[SBJSONalloc]init];    NSDictionary *dic = [js objectWithString:request.responseStringerror:nil];       //裝了所有的微博的信息    NSArray * WBArr = [dic objectForKey:@"statuses"];    for ( int i = 0 ; i < WBArr.count ; i++ )   {        WBModel *Awm = [[WBModelalloc]init]; //一條微博的信息        NSDictionary *dic = [WBArr objectAtIndex:i];        NSString *headImageStr = [[dicobjectForKey:@"user"]objectForKey:@"profile_image_url"];        Awm.headImageURL = headImageStr;        Awm.name = [dic objectForKey:[[dic objectForKey:@"user"]objectForKey:@"name"]];        Awm.text = [dic objectForKey:@"text"];        Awm.createTime = [dic objectForKey:@"created_at"];        [_wbModelArr addObject:Awm];        [Awm release];    }    [_tableView reloadData]; //刷新tableview}- (void)viewDidLoad{    [super viewDidLoad];    //創建地圖    //地圖的類型    //顯示用戶位置、信息    map_view=[[MKMapViewalloc]initWithFrame:self.view.frame];    map_view.delegate=self;    map_view.mapType =MKMapTypeStandard;    map_view.showsUserLocation =YES;    [self.viewaddSubview:map_view];      //創建四個坐標點    CLLocationCoordinate2D coord[4];    coord[0] = CLLocationCoordinate2DMake(41.000512, -109.050116);    coord[1] = CLLocationCoordinate2DMake(41.002371, -102.052066);    coord[2] = CLLocationCoordinate2DMake(36.993076, -102.041981);    coord[3] = CLLocationCoordinate2DMake(36.99892, -109.045267);    //1.畫一個多邊形    //2.畫線    //3.畫圓     MKPolygon *gon=[MKPolygonpolygonWithCoordinates:coordcount:4];    MKPolyline *line=[MKPolylinepolylineWithCoordinates:coordcount:4];    MKCircle *circle=[MKCirclecircleWithCenterCoordinate:coord[0]radius:5000];    [map_view addOverlay:gon];    [map_view addOverlay:line];    [map_view addOverlay:circle];}//1.確定位置  按鈕綁定:自定方法-(void)mapBtn{    //1.2創建一個大頭針(標記)    MyAnn *ann=[[MyAnnalloc]initWithTitle:@"大頭針"withSubtitle:@"具體地址" withCoorinate:coord];    [map_view addAnnotation:ann];    //map_view.centerCoordinate = map_view.userLocation.coordinate;    //[map_view removeAnnotation:ann];}//3.注釋表        代理方法  (pin: 大頭針)MKPinAnnotationView *pin- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{    static NSString  *identifier=@"AnnotationView";    MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapViewdequeueReusableAnnotationViewWithIdentifier:identifier];       if (pin==nil) {        pin= [[MKPinAnnotationView alloc] initWithAnnotation:annotationreuseIdentifier:identifier];    }    if (map_view.userLocation==annotation) {        return nil; //如果位置中:有大頭針 返回空    }    UIButton *Btn=[UIButtonbuttonWithType:UIButtonTypeDetailDisclosure];//按鈕詳情    Btn.frame=CGRectMake(0,0,80,20);    [Btn setTitle:@" 按鈕"forState:UIControlStateNormal];    UIImageView *imageview=[[UIImageViewalloc]initWithFrame:CGRectMake(0,0,32,32)];    imageview.image=[UIImageimageNamed:@"head.png"];    //3.1大頭針的顏色    //3.2能夠顯示彈出氣泡    //3.3右視圖    //3.4左視圖    pin.pinColor= MKPinAnnotationColorGreen;    pin.canShowCallout= YES;    pin.rightCalloutaccessoryView= Btn;    pin.leftCalloutAccessoryView= imageview;    return pin;}//4.輕輕點擊:氣泡  代理方法-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{    //打開系統瀏覽器    [[UIapplication sharedApplication] openURL:[NSURLURLWithString:@"http://www.baidu.com"]];}//4.渲染器        代理方法  (Renderer:渲染器)- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay{    //判斷覆蓋物類型    if ([overlay isKindOfClass:[MKPolygon class]]) {        //創建多邊形的渲染器   //設置多邊形的填充色        //邊框,線的顏色//線條的寬度        MKPolygonRenderer *PR=[[MKPolygonRendereralloc]initWithPolygon:(MKPolygon *)overlay];        PR.fillColor= [UIColorcyanColor];        PR.strokeColor= [UIColormagentaColor];        PR.lineWidth= 3;        return PR;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三台县| 读书| 榆林市| 玉环县| 高要市| 庆城县| 建水县| 东海县| 宁明县| 大姚县| 昔阳县| 湖南省| 札达县| 全椒县| 神农架林区| 玉树县| 射洪县| 兴安盟| 涡阳县| 延寿县| 台中市| 湘阴县| 宣武区| 西宁市| 克什克腾旗| 徐水县| 奉贤区| 丰顺县| 织金县| 德令哈市| 南召县| 凌云县| 拉萨市| 永新县| 衢州市| 包头市| 宜阳县| 庄浪县| 牡丹江市| 新泰市| 永福县|