iOS面試基礎(chǔ)

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套多線程方案,他們分別是:
  1. Pthreads
  2. NSThread
  3. GCD
  4. 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方向:
  1. 創(chuàng)建對象時,盡量用輕量的對象代替重量的對象。比如CALayer 比 UIView要輕量許多,不需要響應(yīng)觸摸事件的控件可以用CALayer來顯示(CALayer控件只能在主線程創(chuàng)建和操作,避免通過Storyboard創(chuàng)建視圖對象)。

  2. 盡量推遲對象的創(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等)

  1. 盡量避免視圖層次調(diào)整,以及視圖添加和移除。

5.避免容器內(nèi)持有大量對象同時銷毀,如果對象可以放到后臺去釋放,難就挪到后臺線程去。

6.盡量減少視圖的布局計算,應(yīng)當(dāng)在后臺提前計算好視圖布局,并且對視圖布局進(jìn)行緩存。(參考第3點,不要多次、頻繁的計算和調(diào)整視圖的這些屬性)

7.. 圖像繪制盡量放到后臺線程,因為CoreGraphic方法通常是線程安全的,圖像顯示時再回到主線程。

  1. 當(dāng)你用UIImage 或 CGImageSource 的相關(guān)方法創(chuàng)建圖片時,應(yīng)當(dāng)在后臺線程先把圖片繪制到 CGBitmapContext 中,從 Bitmap 直接創(chuàng)建圖片。(目前常見的網(wǎng)絡(luò)圖片庫都做了這個處理)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容