一裕菠、遠(yuǎn)程推送原理
??????當(dāng)設(shè)備聯(lián)網(wǎng)的時(shí)候都會(huì)與蘋果的APNS服務(wù)器建立一個(gè)長(zhǎng)鏈接邻储,當(dāng)我們的后臺(tái)服務(wù)器(或者叫:應(yīng)用程序的服務(wù)器)(Provider)推送一條通知的時(shí)候供炼,會(huì)先把要發(fā)送的消息、iPhone的標(biāo)識(shí)打包利朵,發(fā)給蘋果的APNS服務(wù)器待榔。 接著APNS服務(wù)器會(huì)在自身已經(jīng)注冊(cè)Push服務(wù)的設(shè)備列表中查找有相應(yīng)標(biāo)識(shí)的設(shè)備逞壁,并把消息發(fā)送到iPhone。iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序锐锣,并且按照設(shè)預(yù)先設(shè)定好的格式在設(shè)備上彈出通知提醒腌闯。
二、http 與 https 的區(qū)別是什么雕憔?
- http是超文本傳輸協(xié)議姿骏,數(shù)據(jù)明文傳輸,不能保障數(shù)據(jù)傳輸?shù)陌踩越锉恕H菀妆蛔グ?/li>
- http的連接很簡(jiǎn)單,是無狀態(tài)的分瘦。并且使用的端口是80蘸泻。不能驗(yàn)證通信方的身份,因此可能會(huì)遭遇偽裝嘲玫。
- https 則是具有安全性的SSL加密傳輸協(xié)議悦施。端口使用的是443。
- Https協(xié)議需要使用CA付費(fèi)申請(qǐng)證書去团,是具有安全性的 SSL 加密傳輸協(xié)議抡诞。
三、深拷貝與淺拷貝
1.兩者的定義
- 淺拷貝: 并不會(huì)進(jìn)行真正的復(fù)制土陪,而是復(fù)制的對(duì)象和原對(duì)象都指向同一個(gè)地址昼汗。
- 深拷貝: 真正的復(fù)制了一份,復(fù)制的對(duì)象指向了新的地址鬼雀。
2.總結(jié)
- 深拷貝就是內(nèi)容拷貝顷窒,淺拷貝就是指針拷貝。
- 本質(zhì)的區(qū)別在于:
(1).是否開啟新的內(nèi)存地址源哩。
(2).是否影響內(nèi)存地址的引用計(jì)數(shù)鞋吉。
四、反射機(jī)制如何使用璧疗?可以參考這篇博客
// SEL和字符串轉(zhuǎn)換
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
// Class和字符串轉(zhuǎn)換
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);
// Protocol和字符串轉(zhuǎn)換
FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0);
FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);
通過上邊的方法可以動(dòng)態(tài)的創(chuàng)建自己需要的實(shí)例坯辩,也可以動(dòng)態(tài)的選擇調(diào)用哪一個(gè)方法馁龟。
//1.將字符串@"ViewController"轉(zhuǎn)換成Class崩侠。
Class class = NSClassFromString(@"ViewController");
//2.創(chuàng)建控制器的實(shí)例。
ViewController *vc = [[class alloc] init];
//3.把對(duì)應(yīng)的"reloadData"方法名生成SEL坷檩。
SEL selector = NSSelectorFromString(@"reloadData");
//4.執(zhí)行該方法
[vc performSelector:selector];
五却音、SDWebImage 加載圖片的原理
參考的這篇博客這里我只是做了整理總結(jié)。
原理文字描述: SDWebImage 采用的是二級(jí)緩存的機(jī)制矢炼。當(dāng)我們調(diào)用從網(wǎng)絡(luò)獲取圖片的時(shí)候系瓢,會(huì)根據(jù)圖片的URL先去本地
內(nèi)存
中查找,如果查找到的話就直接展示句灌,若沒有找到的話就會(huì)去硬盤
中去查找夷陋,若查找到的話就展示,未查找到就去網(wǎng)絡(luò)請(qǐng)求下載圖片胰锌,下載完成之后將圖片進(jìn)行解碼骗绕,解碼后去展示圖片,然后在將圖片保存到內(nèi)存
和硬盤
中進(jìn)行緩存资昧。
六酬土、runtime 的消息轉(zhuǎn)發(fā)流程是什么?整理參考這篇博客格带,像原文作者致敬撤缴。
利用上圖進(jìn)行分析總結(jié)消息轉(zhuǎn)發(fā)的流程:
例如現(xiàn)在有一個(gè)對(duì)象叫JCCat刹枉,然后又有一個(gè)方法叫eat。方法調(diào)用為[JCCat eat]屈呕。
- 動(dòng)態(tài)解析方法
當(dāng)接收到未知消息的時(shí)候(假設(shè)JCCat
對(duì)象中的eat
方法未實(shí)現(xiàn))微宝,runtime 會(huì)調(diào)用+(BOOL) resolveInstanceMethod:(實(shí)例方法) 或者+resolveClassMethod:(類方法)。
2.備用接收者
若以上方法做了相關(guān)的處理虎眨,那么消息會(huì)正常處理芥吟。若以上方法沒有做處理,runtime會(huì)調(diào)用- (id)forwardingTargetForSelector:(SEL)aSelector方法专甩。若該方法返回了一個(gè)非nil(也不能是self)的對(duì)象钟鸵,而且該該對(duì)象實(shí)現(xiàn)了這個(gè)方法,那么這個(gè)對(duì)象就成了消息的接收者涤躲,消息就被分發(fā)到改對(duì)象棺耍。使用情況:通常在對(duì)象內(nèi)部使用,讓內(nèi)部的另一個(gè)對(duì)象處理消息种樱,在外邊看起來就像是該對(duì)象處理了消息蒙袍。
3.完整的消息轉(zhuǎn)發(fā)
在- (void)forwardInvocation:(NSInvocation *)anInvocation方法中選擇轉(zhuǎn)發(fā)消息的對(duì)象,其中anInvocation對(duì)象封裝了未知消息的所有細(xì)節(jié)嫩挤,并保留調(diào)用結(jié)果發(fā)送到原始調(diào)用者害幅。