1.iOS如何令自己所寫的對象具有拷貝功能?
想讓自己所寫的對象具有拷貝功能,則需實現(xiàn) NSCopying 協(xié)議。如果自定義的對象分為可變版本與不可變版本,那么就要同時實現(xiàn) NSCopying 與 NSMutableCopying 協(xié)議。
- (id)copyWithZone:(NSZone *)zone;
- (id)mutableCopyWithZone:(NSZone *)zone;
2.談?wù)勀銓Χ嗑€程開發(fā)的理解?iOS中有幾種實現(xiàn)多線程的方法?
好處:
- 使用多線程可以把程序中占據(jù)時間長的任務(wù)放到后臺去處理,如圖片,視頻的下載;
- 發(fā)揮多核處理器的優(yōu)勢,并發(fā)執(zhí)行讓系統(tǒng)運(yùn)行的更快,更流暢,用戶體驗更好;
壞處:
- 大量的線程降低代碼的可讀性;
- 更多的線程需要更多的內(nèi)存空間;
- 當(dāng)多個線程對同一個資源出現(xiàn)爭奪的時候要注意線程安全的問題。
在iOS中其實目前有4套多線程方案,他們分別是:
- Pthreads
- NSThread
- GCD
- NSOperation & NSOperationQueue
3.HTTPS的加密原理
- 服務(wù)器端用非對稱加密(RSA)生成公鑰和私鑰;
- 然后把公鑰發(fā)給客戶端, 服務(wù)器則保存私鑰;
- 客戶端拿到公鑰后, 會生成一個密鑰, 這個密鑰就是將來客戶端和服務(wù)器用來通信的鑰匙;
- 然后客戶端用公鑰對密鑰進(jìn)行加密, 再發(fā)給服務(wù)器;
- 服務(wù)器拿到客戶端發(fā)來的加密后的密鑰后, 再使用私鑰解密密鑰, 到此雙方都獲得通信的鑰匙;
4.UIView如何獲取所在的UIViewController?
在iOS中UIResponder類是專門用來響應(yīng)用戶的操作處理各種事件的,包括觸摸事件(Touch Events)、運(yùn)動事件(Motion Events)、遠(yuǎn)程控制事件(Remote Control Events)。我們知道UIApplication、UIView、UIViewController這幾個類是直接繼承自UIResponder,所以這些類都可以響應(yīng)事件。當(dāng)然我們自定義的繼承自UIView的View以及自定義的繼承自UIViewController的控制器都可以響應(yīng)事件。
- (UIViewController *)getControllerFromView:(UIView *)view
{
//遍歷響應(yīng)者鏈,返回第一個找到視圖控制器
UIResponser *responser = view;
while ((responder = [responder nextResponder])){
if ([responder isKindOfClass: [UIViewController class]]){
return (UIViewController *)responder;
}
}
// 如果沒有找到則返回nil
return nil;
}
5.使用atomic一定線程安全嗎?為什么?
這個問題很少遇到,但是答案當(dāng)然不是。
atomic在set方法里加了鎖,防止了多線程一直去寫這個property,造成難以預(yù)計的數(shù)值。但這也只是讀寫的鎖定。跟線程安全其實還是差一些。
也就是要注意:atomic所說的線程安全只是保證了getter和setter存取方法的線程安全,并不能保證整個對象是線程安全的
6.iOS性能優(yōu)化的方向有哪些?
CPU方向:
創(chuàng)建對象時,盡量用輕量的對象代替重量的對象。比如CALayer 比 UIView要輕量許多,不需要響應(yīng)觸摸事件的控件可以用CALayer來顯示(CALayer控件只能在主線程創(chuàng)建和操作,避免通過Storyboard創(chuàng)建視圖對象)。
盡量推遲對象的創(chuàng)建時間,并把對象的創(chuàng)建分散到多個任務(wù)中去。(如果對象可以復(fù)用,并且復(fù)用的代價比釋放、創(chuàng)建新對象要小,那么這類對象應(yīng)當(dāng)盡量復(fù)用)
3.應(yīng)盡量減少對UIView的與CALayer相關(guān)的屬性修改。(比如frame、bounds、transform、center等)
- 盡量避免視圖層次調(diào)整,以及視圖添加和移除。
5.避免容器內(nèi)持有大量對象同時銷毀,如果對象可以放到后臺去釋放,難就挪到后臺線程去。
6.盡量減少視圖的布局計算,應(yīng)當(dāng)在后臺提前計算好視圖布局,并且對視圖布局進(jìn)行緩存。(參考第3點,不要多次、頻繁的計算和調(diào)整視圖的這些屬性)
7.. 圖像繪制盡量放到后臺線程,因為CoreGraphic方法通常是線程安全的,圖像顯示時再回到主線程。
- 當(dāng)你用UIImage 或 CGImageSource 的相關(guān)方法創(chuàng)建圖片時,應(yīng)當(dāng)在后臺線程先把圖片繪制到 CGBitmapContext 中,從 Bitmap 直接創(chuàng)建圖片。(目前常見的網(wǎng)絡(luò)圖片庫都做了這個處理)