1.iOS如何令自己所寫的對象具有拷貝功能壕鹉?
想讓自己所寫的對象具有拷貝功能剃幌,則需實現(xiàn) NSCopying 協(xié)議。如果自定義的對象分為可變版本與不可變版本晾浴,那么就要同時實現(xiàn) NSCopying 與 NSMutableCopying 協(xié)議。
- (id)copyWithZone:(NSZone *)zone;
- (id)mutableCopyWithZone:(NSZone *)zone;
2.談談你對多線程開發(fā)的理解牍白?iOS中有幾種實現(xiàn)多線程的方法脊凰?
好處:
- 使用多線程可以把程序中占據(jù)時間長的任務放到后臺去處理,如圖片茂腥,視頻的下載狸涌;
- 發(fā)揮多核處理器的優(yōu)勢,并發(fā)執(zhí)行讓系統(tǒng)運行的更快最岗,更流暢帕胆,用戶體驗更好;
壞處:
- 大量的線程降低代碼的可讀性般渡;
- 更多的線程需要更多的內(nèi)存空間懒豹;
- 當多個線程對同一個資源出現(xiàn)爭奪的時候要注意線程安全的問題。
在iOS中其實目前有4套多線程方案驯用,他們分別是:
- Pthreads
- NSThread
- GCD
- NSOperation & NSOperationQueue
3.HTTPS的加密原理
- 服務器端用非對稱加密(RSA)生成公鑰和私鑰脸秽;
- 然后把公鑰發(fā)給客戶端, 服務器則保存私鑰;
- 客戶端拿到公鑰后, 會生成一個密鑰, 這個密鑰就是將來客戶端和服務器用來通信的鑰匙蝴乔;
- 然后客戶端用公鑰對密鑰進行加密, 再發(fā)給服務器记餐;
- 服務器拿到客戶端發(fā)來的加密后的密鑰后, 再使用私鑰解密密鑰, 到此雙方都獲得通信的鑰匙;
4.UIView如何獲取所在的UIViewController?
在iOS中UIResponder類是專門用來響應用戶的操作處理各種事件的薇正,包括觸摸事件(Touch Events)片酝、運動事件(Motion Events)、遠程控制事件(Remote Control Events)挖腰。我們知道UIApplication雕沿、UIView、UIViewController這幾個類是直接繼承自UIResponder,所以這些類都可以響應事件曙聂。當然我們自定義的繼承自UIView的View以及自定義的繼承自UIViewController的控制器都可以響應事件晦炊。
- (UIViewController *)getControllerFromView:(UIView *)view
{
//遍歷響應者鏈,返回第一個找到視圖控制器
UIResponser *responser = view;
while ((responder = [responder nextResponder])){
if ([responder isKindOfClass: [UIViewController class]]){
return (UIViewController *)responder;
}
}
// 如果沒有找到則返回nil
return nil;
}
5.使用atomic一定線程安全嗎?為什么断国?
這個問題很少遇到贤姆,但是答案當然不是。
atomic在set方法里加了鎖稳衬,防止了多線程一直去寫這個property霞捡,造成難以預計的數(shù)值。但這也只是讀寫的鎖定薄疚。跟線程安全其實還是差一些碧信。
也就是要注意:atomic所說的線程安全只是保證了getter和setter存取方法的線程安全,并不能保證整個對象是線程安全的
6.iOS性能優(yōu)化的方向有哪些街夭?
CPU方向:
創(chuàng)建對象時砰碴,盡量用輕量的對象代替重量的對象。比如CALayer 比 UIView要輕量許多板丽,不需要響應觸摸事件的控件可以用CALayer來顯示(CALayer控件只能在主線程創(chuàng)建和操作,避免通過Storyboard創(chuàng)建視圖對象)呈枉。
盡量推遲對象的創(chuàng)建時間,并把對象的創(chuàng)建分散到多個任務中去埃碱。(如果對象可以復用猖辫,并且復用的代價比釋放、創(chuàng)建新對象要小砚殿,那么這類對象應當盡量復用)
3.應盡量減少對UIView的與CALayer相關的屬性修改啃憎。(比如frame、bounds似炎、transform辛萍、center等)
- 盡量避免視圖層次調(diào)整,以及視圖添加和移除名党。
5.避免容器內(nèi)持有大量對象同時銷毀叹阔,如果對象可以放到后臺去釋放,難就挪到后臺線程去传睹。
6.盡量減少視圖的布局計算耳幢,應當在后臺提前計算好視圖布局,并且對視圖布局進行緩存欧啤。(參考第3點睛藻,不要多次、頻繁的計算和調(diào)整視圖的這些屬性)
7.. 圖像繪制盡量放到后臺線程邢隧,因為CoreGraphic方法通常是線程安全的店印,圖像顯示時再回到主線程。
- 當你用UIImage 或 CGImageSource 的相關方法創(chuàng)建圖片時倒慧,應當在后臺線程先把圖片繪制到 CGBitmapContext 中按摘,從 Bitmap 直接創(chuàng)建圖片包券。(目前常見的網(wǎng)絡圖片庫都做了這個處理)