iOS中常NSTimer、CADisplayLink、GCD定時器,其中NSTimer、CADisplayLink基於NSRunLoop實現,故存在偏差,GCD定時器只依賴系統內核,相對一前二者是比較準時的。html
偏差緣由是:與NSRunLoop機制有關, 由於RunLoop每跑完一次圈再去檢查當前累計時間是否已經達到定時設置的間隔時間,若是未達到,RunLoop將進入下一輪任務,待任務結束以後再去檢查當前累計時間,而此時的累計時間可能已經超過了定時器的間隔時間,故會存在偏差。ios
參考《iOS常見三種定時器-NSTimer、CADisplayLink、GCD定時器》面試
若是直接使用,會產生循環引用問題。能夠增長一箇中間類,給這個類添加一個用weak修飾的id 類型target屬性,並重寫中間類的消息轉發方法。實現以下代碼:算法
聲明文件.h:json
#import <Foundation/Foundation.h> @interface LXProxy : NSProxy + (instancetype)proxyWithTarget:(id)target; @end
實現文件.m緩存
#import "LXProxy.h" @interface LXProxy () /** weak target*/ @property (nonatomic, weak) id target; @end @implementation LXProxy + (instancetype)proxyWithTarget:(id)target{ LXProxy *proxy = [LXProxy alloc]; proxy.target = target; return proxy; } - (NSMethodSignature *)methodSignatureForSelector:(SEL)sel{ return [self.target methodSignatureForSelector:sel]; } - (void)forwardInvocation:(NSInvocation *)invocation{ [invocation invokeWithTarget:self.target]; } @end
調用代碼:安全
_timer = [NSTimer scheduledTimerWithTimeInterval:2 target:[LXProxy proxyWithTarget:self] selector:@selector(test) userInfo:nil repeats:YES];
runtime是OC動態語言的運行時機制,OC的方法調用最後都轉成了runtime的objc_msgSend函數。網絡
注:對於已經排序好的方法列表,採用二分查算法查找對應的執行函數,對應沒有排序的列表,採用通常遍歷方法查找對應執行函數。函數
由此可知, 實例方法(-方法)查找是沿着其superclass指針逐級父類查找,終於根類對象(root class)。而類方法(+方法)查找是沿着其superclass指針逐級父類(meta)查找,終於根類對象(root class),若是根類對象存在同名實例方法,則會調用同名實例方法oop
+initialize 方法,會在第一次初始化這個類以前被調用,咱們用它來初始化靜態變量。+load 方法會在加載類的時候就被調用,也就是 ios 應用啓動的時候,就會加載全部的類,就會調用每一個類的 +load 方法。initialize 方法相似一個懶加載,若是沒有使用這個類,那麼系統默認不會去調用這個方法,且默認只加載一次,且調用發生在 +init 方法以前。
調用最後參與編譯的分類的test方法。緣由:Xcode在編譯時根據buildPhases->Compile Sources裏面的從上至下順序編譯的,經過壓棧的方式將多個分類壓棧,且根據後進先出的原則,後編譯的會被先調用(插入頂部添加,即[methodLists insertObject:category_method atIndex:0]。因此objc_msgSend遍歷方法列表查找SEL 對應的IMP時,會先找到最後參與編譯的分類)當objc_msgSend找到方法並調用以後,結束傳遞消息,因此就造成了所謂的「覆蓋」。
App冷啓動優化方案博客很是之多,歸納總結大體以下:
HTTPS協議是由SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全
HTTPS協議的主要做用能夠分爲兩種:一種是創建一個信息安全通道,來保證數據傳輸的安全;另外一種就是確認網站的真實性。