解釋一下 事件響應(yīng) 的過程泡一?
蘋果注冊了一個 Source1 (基于 mach port 的) 用來接收系統(tǒng)事件婿着,其回調(diào)函數(shù)為 __IOHIDEventSystemClientQueueCallback()师抄。
當一個硬件事件(觸摸/鎖屏/搖晃等)發(fā)生后,首先由 IOKit.framework 生成一個 IOHIDEvent 事件并由 SpringBoard 接收湖蜕。這個過程的
詳細情況可以參考這里逻卖。SpringBoard 只接收按鍵(鎖屏/靜音等),觸摸昭抒,加速评也,接近傳感器等幾種 Event,隨后用 mach port 轉(zhuǎn)發(fā)給
需要的 App 進程灭返。隨后蘋果注冊的那個 Source1 就會觸發(fā)回調(diào)盗迟,并調(diào)用 _UIApplicationHandleEventQueue() 進行應(yīng)用內(nèi)部的分發(fā)。
_UIApplicationHandleEventQueue() 會把 IOHIDEvent 處理并包裝成 UIEvent 進行處理或分發(fā)熙含,其中包括識別 UIGesture/處理
屏幕旋轉(zhuǎn)/發(fā)送給 UIWindow 等罚缕。通常事件比如 UIButton 點擊、touchesBegin/Move/End/Cancel 事件都是在這個回調(diào)中完成的
解釋一下 手勢識別 的過程怎静?
當上面的 _UIApplicationHandleEventQueue() 識別了一個手勢時邮弹,其首先會調(diào)用 Cancel 將當前的 touchesBegin/Move/End 系列
回調(diào)打斷。隨后系統(tǒng)將對應(yīng)的 UIGestureRecognizer 標記為待處理蚓聘。
蘋果注冊了一個 Observer 監(jiān)測 BeforeWaiting (Loop即將進入休眠) 事件腌乡,這個 Observer 的回調(diào)函數(shù)是 _UIGestureRecognizerUpdateObserver(),
其內(nèi)部會獲取所有剛被標記為待處理的 GestureRecognizer或粮,并執(zhí)行GestureRecognizer 的回調(diào)导饲。
當有 UIGestureRecognizer 的變化(創(chuàng)建/銷毀/狀態(tài)改變)時,這個回調(diào)都會進行相應(yīng)處理
什么是 Mimetype ?
在瀏覽器中顯示的內(nèi)容有 HTML、有 XML渣锦、有 GIF硝岗、還有 Flash ……那么,瀏覽器是如何區(qū)分它們袋毙,決定什么內(nèi)容用什么形式來顯示呢型檀?答案是 MIME Type,也就是該資源的媒體類型听盖。
//向該文件發(fā)送請求,根據(jù)請求頭拿到該文件的MIMEType
-(NSString *)getMIMETypeURLRequestAtPath:(NSString*)path
{
//1.確定請求路徑
NSURL *url = [NSURL fileURLWithPath:path];
//2.創(chuàng)建可變的請求對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//3.發(fā)送請求
NSHTTPURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
NSString *mimeType = response.MIMEType;
return mimeType;
}
大文件下載 的功能有什么注意點胀溺?
注意要邊下載數(shù)據(jù)邊寫入文件,不然會造成占用內(nèi)存空間過大
說一下 GCD 并發(fā)隊列實現(xiàn)機制皆看?
利用的時間片輪轉(zhuǎn)
多線程的 并行 和 并發(fā) 有什么區(qū)別仓坞?
并行:充分利用計算機的多核,在多個線程上同步進行
并發(fā):在一條線程上通過快速切換腰吟,讓人感覺在同步進行
子線程是否會出現(xiàn)死鎖无埃?說一下場景?
dispatch_queue_t serialQueue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
dispatch_sync(serialQueue, ^{
NSLog(@"deadlock");
});
});
在什么情況下會觸發(fā) KVO?
1.使用了KVC
使用了 `KVC`毛雇,如果有訪問器方法嫉称,則運行時會在訪問器方法中調(diào)用 `will/didChangeValueForKey:` 方法; 沒用訪問器方法灵疮,運行時會在 `setValue:forKey` 方法中調(diào)用 `will/didChangeValueForKey:`方法织阅。
2.有訪問器方法
運行時會重寫訪問器方法調(diào)用 `will/didChangeValueForKey:` 方法。 因此震捣,直接調(diào)用訪問器方法改變屬性值時荔棉,`KVO` 也能監(jiān)聽到。
3.直接調(diào)用
顯式調(diào)用 `will/didChangeValueForKey:` 方法伍派。
如何優(yōu)化 APP 的電量江耀?
程序的耗電主要在以下四個方面:
* CPU 處理
* 定位
* 網(wǎng)絡(luò)
* 圖像
優(yōu)化的途徑主要體現(xiàn)在以下幾個方面:
盡可能降低 CPU、GPU 的功耗诉植。
盡量少用 定時器祥国。
優(yōu)化 I/O 操作。
不要頻繁寫入小數(shù)據(jù)晾腔,而是積攢到一定數(shù)量再寫入
讀寫大量的數(shù)據(jù)可以使用 Dispatch_io 舌稀,GCD 內(nèi)部已經(jīng)做了優(yōu)化。
數(shù)據(jù)量比較大時灼擂,建議使用數(shù)據(jù)庫
網(wǎng)絡(luò)方面的優(yōu)化
減少壓縮網(wǎng)絡(luò)數(shù)據(jù) (XML -> JSON -> ProtoBuf)壁查,如果可能建議使用 ProtoBuf。
如果請求的返回數(shù)據(jù)相同剔应,可以使用 NSCache 進行緩存
使用斷點續(xù)傳睡腿,避免因網(wǎng)絡(luò)失敗后要重新下載语御。
網(wǎng)絡(luò)不可用的時候,不嘗試進行網(wǎng)絡(luò)請求
長時間的網(wǎng)絡(luò)請求席怪,要提供可以取消的操作
采取批量傳輸应闯。下載視頻流的時候,盡量一大塊一大塊的進行下載挂捻,廣告可以一次下載多個
定位層面的優(yōu)化
如果只是需要快速確定用戶位置碉纺,最好用 CLLocationManager 的 requestLocation 方法。定位完成后刻撒,會自動讓定位硬件斷電
如果不是導航應(yīng)用骨田,盡量不要實時更新位置,定位完畢就關(guān)掉定位服務(wù)
盡量降低定位精度声怔,比如盡量不要使用精度最高的 kCLLocationAccuracyBest
需要后臺定位時态贤,盡量設(shè)置 pausesLocationUpdatesAutomatically 為 YES,如果用戶不太可能移動的時候系統(tǒng)會自動暫停位置更新
盡量不要使用 startMonitoringSignificantLocationChanges醋火,優(yōu)先考慮 startMonitoringForRegion:
硬件檢測優(yōu)化
用戶移動、搖晃胎撇、傾斜設(shè)備時,會產(chǎn)生動作(motion)事件晚树,這些事件由加速度計、陀螺儀爵憎、磁力計等硬件檢測。在不需要檢測的場合宝鼓,應(yīng)該及時關(guān)閉這些硬件
組件里面的圖片怎么獲取
NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
NSString *currentBundleName = currentBundle.infoDictionary[@"CFBundleName"];
NSString *imagePath = [currentBundle pathForResource:@"image@2x.png" ofType:nil inDirectory:[NSString stringWithFormat:@"%@.bundle",currentBundleName]];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
如果以后做業(yè)務(wù)組件,需要依賴我們的私有組件,可以省略本地驗證/本地驗證,只要我們的提交是成功的就行了