1.多線程梅桩、特別是NSOperation和GCD的內(nèi)部原理:
->1)NSThread
優(yōu)點(diǎn):NSThread比其他兩個(gè)輕量級(jí)
缺點(diǎn):需要自己管理線程的生命周期塔鳍,線程同步伯铣。線程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開銷
2)Cocoa? NSOperation
優(yōu)點(diǎn):不需要關(guān)心線程管理,數(shù)據(jù)同步的事情献幔,可以把精力放在自己需要執(zhí)行的操作上懂傀。
Cocoa operation相關(guān)的類是NSOperation, NSOperationQueue.
NSOperation是個(gè)抽象類,使用它必須用它的子類,可以實(shí)現(xiàn)它或者使用它定義好的兩個(gè)子類: NSInvocationOperation和NSBlockOperation.
創(chuàng)建NSOperation子類的對(duì)象蜡感,把對(duì)象添加到NSOperationQueue隊(duì)列里執(zhí)行蹬蚁。
3) GCD(全優(yōu)點(diǎn))
Grand Central dispatch(GCD)是Apple開發(fā)的一個(gè)多核編程的解決方案。在iOS4.0開始之后才能使用郑兴。GCD是一個(gè)替代NSThread, NSOperationQueue,NSInvocationOperation等技術(shù)的很高效強(qiáng)大的技術(shù)犀斋。
————————————————————
2.運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場景:
->機(jī)制:Objective-C語言是一門動(dòng)態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時(shí)期做的事放到了運(yùn)行時(shí)來處理情连;這種特性意味著Objective-C不僅需要一個(gè)編譯器叽粹,還需要一個(gè)運(yùn)行時(shí)系統(tǒng)來執(zhí)行編譯的代碼;這個(gè)運(yùn)行時(shí)系統(tǒng)即Objc Runtime却舀。Objc Runtime其實(shí)是一個(gè)Runtime庫虫几,它基本上是用C和匯編寫的,這個(gè)庫使得C語言有了面向?qū)ο蟮哪芰Α?/p>
->應(yīng)用場景:runtime發(fā)送消息挽拔;runtime交換方法(繼承系統(tǒng)的類,重寫方法);runtime動(dòng)態(tài)添加方法;runtime給分類添加屬性;runtime字典轉(zhuǎn)模型;runtime快速歸檔
————————————————
3.SDWebImage的原理,實(shí)現(xiàn)機(jī)制:
->SDWebImage內(nèi)部實(shí)現(xiàn)過程
入口setImageWithURL:placeholderImage:options:會(huì)先把placeholderImage顯示辆脸,然后SDWebImageManager根據(jù)URL開始處理圖片。
進(jìn)入SDWebImageManager-downloadWithURL:delegate:options:userInfo:螃诅,交給SDImageCache從緩存查找圖片是否已經(jīng)下載queryDiskCacheForKey:delegate:userInfo:.
先從內(nèi)存圖片緩存查找是否有圖片啡氢,如果內(nèi)存中已經(jīng)有圖片緩存状囱,SDImageCacheDelegate回調(diào)imageCache:didFindImage:forKey:userInfo:到SDWebImageManager。
SDWebImageManagerDelegate回調(diào)webImageManager:didFinishWithImage:到UIImageView+WebCache等前端展示圖片倘是。
如果內(nèi)存緩存中沒有亭枷,生成NSInvocationOperation添加到隊(duì)列開始從硬盤查找圖片是否已經(jīng)緩存。
根據(jù)URLKey在硬盤緩存目錄下嘗試讀取圖片文件搀崭。這一步是在NSOperation進(jìn)行的操作叨粘,所以回主線程進(jìn)行結(jié)果回調(diào)notifyDelegate:。
如果上一操作從硬盤讀取到了圖片瘤睹,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過小宣鄙,會(huì)先清空內(nèi)存緩存)。SDImageCacheDelegate回調(diào)imageCache:didFindImage:forKey:userInfo:默蚌。進(jìn)而回調(diào)展示圖片。
如果從硬盤緩存目錄讀取不到圖片苇羡,說明所有緩存都不存在該圖片绸吸,需要下載圖片,回調(diào)imageCache:didNotFindImageForKey:userInfo:设江。
共享或重新生成一個(gè)下載器SDWebImageDownloader開始下載圖片锦茁。
圖片下載由NSURLConnection來做,實(shí)現(xiàn)相關(guān)delegate來判斷圖片下載中叉存、下載完成和下載失敗码俩。
connection:didReceiveData:中利用ImageIO做了按圖片下載進(jìn)度加載效果。
connectionDidFinishLoading:數(shù)據(jù)下載完成后交給SDWebImageDecoder做圖片解碼處理歼捏。
圖片解碼處理在一個(gè)NSOperationQueue完成稿存,不會(huì)拖慢主線程UI。如果有需要對(duì)下載的圖片進(jìn)行二次處理瞳秽,最好也在這里完成瓣履,效率會(huì)好很多。
在主線程notifyDelegateOnMainThreadWithInfo:宣告解碼完成练俐,imageDecoder:didFinishDecodingImage:userInfo:回調(diào)給SDWebImageDownloader袖迎。
imageDownloader:didFinishWithImage:回調(diào)給SDWebImageManager告知圖片下載完成。
通知所有的downloadDelegates下載完成腺晾,回調(diào)給需要的地方展示圖片燕锥。
將圖片保存到SDImageCache中,內(nèi)存緩存和硬盤緩存同時(shí)保存悯蝉。寫文件到硬盤也在以單獨(dú)NSInvocationOperation完成归形,避免拖慢主線程。
SDImageCache在初始化的時(shí)候會(huì)注冊(cè)一些消息通知泉粉,在內(nèi)存警告或退到后臺(tái)的時(shí)候清理內(nèi)存圖片緩存连霉,應(yīng)用結(jié)束的時(shí)候清理過期圖片榴芳。
SDWI也提供了UIButton+WebCache和MKAnnotationView+WebCache,方便使用跺撼。
SDWebImagePrefetcher可以預(yù)先下載圖片窟感,方便后續(xù)使用。
———————————————————————————
4.block和代理的歉井,通知的區(qū)別柿祈。block的用法需要注意些什么:
->區(qū)別:1.NotificationCenter通知中心:“一對(duì)多”,在APP中哩至,很多控制器都需要知道一個(gè)事件躏嚎,應(yīng)該用通知;
2.delegate代理委托:
1菩貌,“一對(duì)一”卢佣,對(duì)同一個(gè)協(xié)議,一個(gè)對(duì)象只能設(shè)置一個(gè)代理delegate箭阶,所以單例對(duì)象就不能用代理虚茶;
2,代理更注重過程信息的傳輸:比如發(fā)起一個(gè)網(wǎng)絡(luò)請(qǐng)求仇参,可能想要知道此時(shí)請(qǐng)求是否已經(jīng)開始嘹叫、是否收到了數(shù)據(jù)、數(shù)據(jù)是否已經(jīng)接受完成诈乒、數(shù)據(jù)接收失敗
3.block(閉包)
block和delegate一樣罩扇,一般都是“一對(duì)一”之間通信交互,相比代理block有以下特點(diǎn)
1:寫法更簡練怕磨,不需要寫protocol喂饥、函數(shù)等等
2,block注重結(jié)果的傳輸:比如對(duì)于一個(gè)事件癌压,只想知道成功或者失敗仰泻,并不需要知道進(jìn)行了多少或者額外的一些信息
3,block需要注意防止循環(huán)引用
—————————————————————————
5.單利的寫法,在單利中創(chuàng)建數(shù)組應(yīng)該注意些什么:
->+ (instancetype)shareId
{
static ViewController *VC = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
VC = [[ViewController alloc] init];
});
return VC;
}
6.->http狀態(tài)嗎:302是請(qǐng)求重定向滩届。500以上是服務(wù)器錯(cuò)誤集侯。400以上是請(qǐng)求鏈接錯(cuò)誤或者找不到服務(wù)器。200以上是正確帜消。100以上是請(qǐng)求接受成功
——————————————————————
7.什么是TCP連接的三次握手:
->第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器棠枉,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)泡挺;
第二次握手:服務(wù)器收到syn包辈讶,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k)娄猫,即SYN+ACK包贱除,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)生闲;
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)月幌,此包發(fā)送完畢碍讯,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手扯躺。
————————————————————————
8.內(nèi)存分區(qū):
->代碼區(qū)捉兴;常量區(qū);全局區(qū)(靜態(tài)區(qū))录语;堆區(qū)(存放對(duì)象)芹壕;棧區(qū)(存放局部變量)
————————————————————————
9.KVC(key value coding)和KVO(key value observing):
->1.KVC方式可以更便捷的設(shè)置獲取對(duì)象的值(可以批處理浮禾,鍵路徑)。
2.KVO可以對(duì)對(duì)象進(jìn)行監(jiān)聽屬性的變化儿奶。
區(qū)別:KVC(鍵值編碼)行剂,即Key-Value Coding翎猛,一個(gè)非正式的Protocol遥金,使用字符串(鍵)訪問一個(gè)對(duì)象實(shí)例變量的機(jī)制可很。而不是通過調(diào)用Setter、Getter方法等顯式的存取方式去訪問弟塞。
KVO(鍵值監(jiān)聽),即Key-Value Observing拙已,它提供一種機(jī)制,當(dāng)指定的對(duì)象的屬性被修改后,對(duì)象就會(huì)接受到通知决记,前提是執(zhí)行了setter方法、或者使用了KVC賦值倍踪。
--------------------------------------------------------------------------------
10.http協(xié)議 get post的區(qū)別:
---->POST是安全的,GET是不安全的系宫。
GET請(qǐng)求地址和參數(shù)全放在請(qǐng)求頭中,POST請(qǐng)求地址和請(qǐng)求參數(shù)分離,地址放在請(qǐng)求頭中建车,參數(shù)拼接放入請(qǐng)求體扩借。
GET和POST都是和服務(wù)器提交參數(shù)/通訊的一種方式。
GET參數(shù)不能太長<1024B POST沒有限制<4G
GET不能上傳文件, POST可以上傳文件缤至。