iOS開發(fā)知識點(diǎn)總結(jié)(四)

1.請簡述視圖控制器的生命周期

(1)alloc:創(chuàng)建對象,分配空間

(2)init:初始化對象

(3)loadView:從xib中載入視圖

(4)viewDidLoad:載入完成,可以自定義數(shù)據(jù)和控件

(5)viewWillAppear:視圖將要出現(xiàn)在屏幕上之前

(6)viewDidAppear:視圖已經(jīng)出現(xiàn)在屏幕上

(7)viewWillDisappear:視圖將要消失

(8)viewDidDisappear:視圖已經(jīng)消失

(9)銷毀

2.UITableView有哪些優(yōu)化方式

(1)提前計(jì)算并緩存好高度(布局),因?yàn)閔eightForRowAtIndexPath是調(diào)用最頻繁的方法;

(2)異步繪制。遇到復(fù)雜界面,遇到性能瓶頸時,可能就是突破口。

(3)滑動時按需加載,這個在大量圖片展示,網(wǎng)絡(luò)加載的時候很管用

(4)cell的復(fù)用

(5)盡量少使用或者不用透明的圖層

(6)用異步加載數(shù)據(jù),緩存請求結(jié)果

(7)減少subView的數(shù)量

(8)異步刷新

(9)提前注冊

3.簡述iOS中的事件傳遞機(jī)制

點(diǎn)擊一個UIView或產(chǎn)生一個觸摸事件A,這個觸摸事件A會被添加到UIApplication管理的事件隊(duì)列中(即,首先接收到事件的是UIApplication)。

UIApplication會從事件隊(duì)列中取出最前面的事件(此處假設(shè)為觸摸事件A),把事件A傳遞給應(yīng)用程序的主窗口(KeyWindow)。

窗口會在視圖層次結(jié)構(gòu)中找到一個最合適的視圖來處理觸摸事件。

事件交由第一響應(yīng)者對象處理,如果第一響應(yīng)者不處理,事件被沿著響應(yīng)鏈向上傳遞,交給下一個響應(yīng)者,直到事件被丟棄。

4.UITableView中有哪些必須要實(shí)現(xiàn)的數(shù)據(jù)源的方法

(1)每組的行數(shù)

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

(2)每行的cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

5.簡述HTTP協(xié)議中GET請求和POST請求的區(qū)別

GET和POST的主要區(qū)別表現(xiàn)在數(shù)據(jù)傳遞上

(1)GET:

①在請求URL后面以‘?’的形式跟上發(fā)送給服務(wù)器的參數(shù),多個參數(shù)之間用‘&’隔開,比如http://www.test.com/login?username=123&pwd=234&type=JSON

②由于瀏覽器和服務(wù)器對URL長度有限制,因此URL后面附帶的參數(shù)是限制的,通常不能超過1kb

(2)POST:

①發(fā)送給服務(wù)器的參數(shù)全部放在請求體中

②理論上,POST傳遞的數(shù)據(jù)量沒有限制(具體還得看服務(wù)器的處理能力)

(3)選擇

①如果要傳遞大量數(shù)據(jù),比如文件上傳,只能用POST請求

②GET的安全性比POST要差些,如果包含機(jī)密、敏感信息,建議用POST

③如果僅僅是索取數(shù)據(jù)(數(shù)據(jù)查詢),建議用GET

④如果是增加、修改、刪除數(shù)據(jù),建議使用POST

6.簡述對異步請求的理解

異步請求:通過兩個線程調(diào)用服務(wù),一個線程發(fā)送,一個線程接受,請求行為在后臺,不會導(dǎo)致頁面假死

7.iOS中那些技術(shù)可以實(shí)現(xiàn)開辟線程,他們之間的聯(lián)系和區(qū)別是什么?

創(chuàng)建方式:NSThread,NSOperation,GCD。

聯(lián)系:

三種編程方式都是針對線程操作來講的,從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單。

區(qū)別:

(1)NSThread:

優(yōu)點(diǎn):NSThread比其他兩個輕量級,使用簡單。

缺點(diǎn):需要自己管理線程的生命周期、線程同步、加鎖、睡眠以及喚醒等。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷。

(2)NSOperation:

不需要關(guān)心線程管理,數(shù)據(jù)同步的事情,可以把精力放在自己需要執(zhí)行的操作上

NSOperation是面向?qū)ο蟮模贠C語言實(shí)現(xiàn)的API。兩種默認(rèn)實(shí)現(xiàn)為:NSInvocationOperation和NSBlockOperation。

(3)GCD:

Grand Central Dispatch是由蘋果開發(fā)的一個多核編程的解決方案。iOS4.0以后才能使用,是替代NSThread,NSOperation的高效和強(qiáng)大的技術(shù)。

GCD是基于C語言的API,提供了非常多強(qiáng)大的函數(shù)。GCD會自動管理線程的聲明周期(創(chuàng)建線程、調(diào)度任務(wù)、銷毀線程)。程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要比那些人和線程管理代碼。我們在編寫GCD相關(guān)代碼的時候,面對的是函數(shù),而不是方法。GCD中的函數(shù)大多數(shù)都以dispatch開頭。

8.NSThread中線程的通信方式

(1)線程間通信:

在1個進(jìn)程中,線程往往不是孤立存在的,多個線程之間需要經(jīng)常進(jìn)行通信。

(2)線程間通信的體現(xiàn):

①1個線程傳遞數(shù)據(jù)給另1個線程;

②在1個線程中執(zhí)行完特定任務(wù)后,轉(zhuǎn)到另1個線程繼續(xù)執(zhí)行任務(wù)。

線程間通信常用方法:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)the withObject:(id)arg waitUntilDone:(BOOL)wait;

舉例(下載圖片):

//在子線程中調(diào)用download方法下載圖片

[self performSelectorInBackground:@selector(download) withObject:nil]

- (void)download {

? ? ? //圖片下載完成

? ? ? //回到主線程中設(shè)置圖片

? ? ? //第一種方式

? ? ? //[self performSelectorOnMainThread:@selector(settingImage:) withObject:image waitUntilDone:NO];

? ? ? //第二種方式

? ? ? [self.imageView performSelector:@selector(setImage:) ?onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];

? ? ? //第三種方式

? ? ? [self.iconView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];

}

9.GCD的線程通信

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {

? ? ? //執(zhí)行耗時的異步操作

? ? ? dispatch_async(dispatch_get_main_queue(), ^ {

? ? ? ? ? ? //回到主線程,執(zhí)行UI刷新操作

? ? ? });

});

9.GCD中有哪些創(chuàng)建線程的方式

GCD全程Grand Central Dispatch,可稱為大中央調(diào)度。實(shí)際上GCD是管理著一個線程池,如何創(chuàng)建線程,如何回收線程,以及分配多少個線程,這些都是GCD來控制的。在開發(fā)中,程序員是不用操作程序的相關(guān)事情,只需要把應(yīng)該做的操作放到相應(yīng)的隊(duì)列里即可。

在GCD中加入了兩個非常重要的概念:任務(wù)和隊(duì)列。

(1)任務(wù):即操作,GCD中就是一個Block。任務(wù)有兩種執(zhí)行方式:同步執(zhí)行和異步執(zhí)行。

同步(sync)和異步(async)的主要區(qū)別自傲與會不會阻塞當(dāng)前線程,直到Block任務(wù)執(zhí)行完畢。

如果是同步操作,它會阻塞當(dāng)前線程,并等待Block中的任務(wù)執(zhí)行完畢,然后當(dāng)前線程才會繼續(xù)往下運(yùn)行。

如果是異步(async)操作,當(dāng)前線程會直接往下執(zhí)行,它不會阻塞當(dāng)前線程。

(2)隊(duì)列:用于存放任務(wù)。一種有兩種隊(duì)列,串行隊(duì)列和并行隊(duì)列。

串行隊(duì)列中的任務(wù)會根據(jù)隊(duì)列的定義FIFO地執(zhí)行(即一個接一個的先進(jìn)先出地進(jìn)行執(zhí)行)。

并行隊(duì)列的任務(wù),GCD也會FIFO地取出來,但不同的是,它取出來一個就會放到別的線程,然后再取出來一個又放到另一個線程。

隊(duì)列與線程管理:

三大隊(duì)列種類:

(1)主線程的main queue,通過dispatch_get_main_queue獲取。

(2)并行隊(duì)列g(shù)lobal dispatch queue,通過dispatch_get_global_queue獲取,由系統(tǒng)創(chuàng)建(不需要開發(fā)人員去創(chuàng)建)三個不同優(yōu)先級的dispatch queue。并行隊(duì)列的執(zhí)行順序與其加入隊(duì)列的順序相同。

(3)串行隊(duì)列serial queue一般用于按順序同步訪問,可創(chuàng)建任意數(shù)量的串行隊(duì)列,各個串行隊(duì)列之間是并發(fā)的。一般用dispatch_queue_create來進(jìn)行創(chuàng)建,非ARC的情況下需要用戶手動來釋放隊(duì)列,可能會有人說,既然隊(duì)列是一種對象,可以創(chuàng)建和釋放,那一定會有引用計(jì)數(shù)器,確實(shí),可以使用函數(shù)dispatch_retain和dispatch_release來增加或減少引用計(jì)數(shù)。

兩種提交job的方式:dispatch_async和dispatch_sync,分別是異步執(zhí)行和同步執(zhí)行,兩者之前的區(qū)別在于,前者把任務(wù)提交到隊(duì)列執(zhí)行不會阻塞,而后者后面的代碼塊需要等到隊(duì)列中的任務(wù)執(zhí)行完成后才可以執(zhí)行

(1)//主線程異步執(zhí)行

dispatch_async(dispatch_get_main_queue(), ^{......});

(2)//主線程同步執(zhí)行

dispatch_sync(dispatch_get_main_queue(), ^{......});

10.GCD在哪三種隊(duì)列和用法

(1)The main queue:與主線程功能相同。實(shí)際上,提交至main queue的任務(wù)會在主線程中執(zhí)行。main queue可以調(diào)用dispatch_get_main_queue()來獲得。因?yàn)閙ain queue是與主線程相關(guān)的,所以這是一個串行隊(duì)列。

(2)Global queue:全局隊(duì)列是并發(fā)隊(duì)列,并由整個進(jìn)程共享。進(jìn)程中存在三個全局隊(duì)列:高、中(默認(rèn))、低三個優(yōu)先級隊(duì)列??梢哉{(diào)用dispatch_get_global_queue(0,0)函數(shù)傳入優(yōu)先級來訪問隊(duì)列。

(3)用戶隊(duì)列:用戶隊(duì)列(GCD并不這樣稱呼這種隊(duì)列,但是沒有一個特定的名字來形容這種隊(duì)列,所以我們稱其為用戶隊(duì)列)是用函數(shù)dispatch_queue_create(,)(①隊(duì)列名稱,②隊(duì)列的類型:并行隊(duì)列DISPATCH_QUEUE_CONCURRENT;串行隊(duì)列DISPATCH_QUEUE_SERIAL)

11.iOS中有哪些技術(shù)可以保證線程安全

增加互斥鎖:有效防止因多線程搶奪資源造成的安全問題。線程同步,多條線程按順序地執(zhí)行任務(wù)?;コ怄i就是使用了線程同步計(jì)數(shù)。?

atomic加鎖。

12.簡述AFNetworking的實(shí)現(xiàn)原理

AFN,全稱AFNetworking,雖然運(yùn)行效率沒有ASI高,但是使用比ASI簡單,是對NSURLConnection和NSURLSession分別進(jìn)行的封裝。

AFN內(nèi)部的RunLoop:

AFN內(nèi)部開了一條專門用來訪問網(wǎng)絡(luò)請求的線程,在這個開線程的方法中,它把方法和dispatch_once都用static修飾了下,以保證這個方法的安全性以及只開辟一塊內(nèi)存空間,而且保證它的線程不會卡死。在這個方法中它會調(diào)用另一個網(wǎng)絡(luò)請求入口的方法,在這個入口方法中它會創(chuàng)建一個RunLoop,然后添加一個NSMachPort端口,目的是為了讓他里面有Source(因?yàn)橛辛薙ource的RunLoop才能真正跑起來),然后啟動RunLoop,通過RunLoop在里面不斷地循環(huán),不斷地發(fā)送消息,讓它做事情

13.Block有什么用途

Block是對象,它封裝了一段代碼,這段代碼可以在任何時候執(zhí)行。

Block可以作為函數(shù)參數(shù)或者函數(shù)的返回值,而其本身又可以攜帶參數(shù)或者返回值。它和傳統(tǒng)的函數(shù)指針很類似,但是有區(qū)別:Block是inline的,并且它對局部變量是只讀的。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容