成熟的程序員應該掌握的4個知識點

在iOS大全公衆號上看到,面試秒殺初級程序員的四道大題,說10k以上的程序員應該能夠回答解釋這些知識點。看到文章最後說道,20k的程序員也未必能夠所有完整的回答,此時內心平衡多了,哈哈,因此就拉出來給你們看看程序員

 1.struct和class的區別web

有這麼幾點不一樣:面試

     class是引用類型,struct是值類型數據庫

  class能夠繼承類、接口和被繼承,stryct只能繼承接口,不能被繼承編程

  class有默認的無參構造函數,有析構函數,struct沒有默認的無參構造函數,只能聲明有參的構造函數,沒有析構函數 swift

  class可使用abstract和sealed,有protected修飾符,struct不能夠用abstract和sealed,沒有protected修飾符;設計模式

  class必須使用new初始化,結構能夠不用new初始化;數組

  class實例由垃圾回收機制來保證內存的回收處理,而struct變量使用完後當即自動解除內存分配;  瀏覽器

  從職能觀點來看,class表現爲行爲,而struct經常使用於存儲數據;服務器

  做爲參數傳遞時,class變量以按址方式傳遞,而struct變量是以按值方式傳遞的

  既然介紹這麼多,那咱們應該怎樣選擇結構仍是類

    1).堆棧的空間有限,對於大量的邏輯的對象,建立類要比建立結構好一些 
    2).結構表示如點、矩形和顏色這樣的輕量對象,例如,若是聲明一個含有 1000 個點對象的數組,則將爲引用每

個對象分配附加的內存。在此狀況下,結構的成本較低
    3).在表現抽象和多級別的對象層次時,類是最好的選擇 
    4).大多數狀況下該類型只是一些數據時,結構是最佳的選擇

  補充:

  C語言中,struct與的class的區別:

  struct只是做爲一種複雜數據類型定義,不能用於面向對象編程。

  C++中,struct和class的區別:

  對於成員訪問權限以及繼承方式,class中默認的是private的,而struct中則是public的。class還能夠用於表示模板類型,struct則不行。

   swfit裏的array是什麼類型,在大量複製時會不會有性能問題

   array在swift中是用struct實現的。Apple重寫過一次array,而後複製就是深度拷貝了。要是屢次拷貝且不進行修改的話,全部arrays指向的都是同一個物理地址,只是指針移動,因此性能上仍是不錯的。固然要是修改的話,array就會從新拷貝一份,這個時候開銷就有點大了。

class Program
    {
        static void Main(string[] args)
        {
            Student stu1 = new Student(18, "小芳");
            Student stu2 = new Student(24, "小剛");
            stu2 = stu1;
            stu1.age = 30;
            stu1.name = "小燕";
            Console.WriteLine(stu2.age);
            Console.WriteLine(stu2.name);
            Console.ReadKey();
        }
    }
    struct Student 
    {
        public int age;
        public string name;
        public Student(int age, string name)
        {
            this.age = age;
            this.name = name;
        }
    }

問輸出結果。

實驗了一下,輸出的是"18,小芳"。把"struct"改爲"class",別的不用改,運行。那麼輸出就變成了"30,小燕"。這就說明了struct是值類型,不是引用類型。

1.struct 是值類型,class是對象類型

2.struct 不能被繼承,class能夠被繼承

3.struct 默認的訪問權限是public ,而class 默認的訪問權限是private .

4.struct 不能由程序員申明構造函數,即便是默認(不帶參數)的構造函數,一樣也不能有析構的處理部分。這是由於struct 的構造函數是由編譯器自動生成的。而且struct 的用途是那些描述輕量級的對象,例如Line ,Point 等,而且效率比較高。

5.struct 的new 和class 的new 是不一樣的。struct 的new 就是執行一下構造函數建立一個新實例再對全部的字段進行Copy 。而class 則是在堆上分配一塊內存而後再執行構造函數,struct 的內存並非在new 的時候分配的,而是在定義的時候分配

 

有人問「爲何不能繼承System.Guid 中NewGuid方法呢」,答案是很簡單的,由於System.Guid 是結構而不是類。

好比定義以下結構和類

 

public struct MyType
{
    public int MyInteger;
}

public class Class1 : MyType
{
}

 

這段代碼將拋出編譯錯誤內容爲 "Class1: cannot inherit from sealed class MyType". 

再以下面代碼:

 

public struct MyType
{
    public int MyInteger;
}

public struct Class1 : MyType
{
}

 

編譯錯誤以下: "Class1: type in interface list is not an interface". 


下面列舉出微軟提供的例子供你們學習


//Copyright (C) 2000 Microsoft Corporation.  All rights reserved.

// struct2.cs
using System;

class TheClass
{
    public int x;
}

struct TheStruct
{
    public int x;
}

class TestClass
{
    public static void structtaker(TheStruct s)
    {
        s.x = 5;
    }
    public static void classtaker(TheClass c)
    {
        c.x = 5;
    }
    public static void Main()
    {
        TheStruct a = new TheStruct();
        TheClass b = new TheClass();
        a.x = 1;
        b.x = 1;
        structtaker(a);
        classtaker(b);
        Console.WriteLine("a.x = {0}", a.x);
        Console.WriteLine("b.x = {0}", b.x);
    }
}



這個例子的輸出是:

a.x = 1b.x = 5

從這個例子例子能夠看出,當一個結構被傳遞到一個方法時,被傳遞的只不過是一個副本,而一個類被傳遞時,被傳遞的是一個參考.因此a.x=輸出的是1,不變,而b.x卻變了.

還有的區別就是結構能夠不用new來實例化,而類卻要.若是你不用new來實例化一個結構,那麼全部的字段將仍然處於未分配狀態,直到全部的字段被初始化.和類同樣,結構能夠執行接口.更重要的是,結構沒有繼承性,一個結構不能從別的類繼承,也不能是別的類的基類.
詳細解釋

 

2.介紹一下觀察者模式

 

也許有些人已經以爲設計模式有些過期,沒有整本讀過。就算如此iOS裏經常使用的幾個設計模式我以爲總要了解吧。

這裏若是說NSNotificationCenter怎麼使用的就直接pass。

這個回答應該包括三個部分:首先這個設計模式爲了解決什麼問題,其次經過什麼方案來解決,最後纔是當前體系下的具體實現方案。

觀察者模式(Observer Pattern):定義對象間的一種一對多依賴關係,使得每當一個對象狀態發生改變時,其相關依賴對象皆獲得通知並被自動更新。

在IOS中典型的推模型實現方式爲NSNotificationCenter和KVO。

NSNotificationCenter

  • 觀察者Observer,經過NSNotificationCenter的addObserver:selector:name:object接口來註冊對某一類型通知感興趣。在註冊時候必定要注意,NSNotificationCenter不會對觀察者進行引用計數+1的操做,咱們在程序中釋放觀察者的時候,必定要去報從center中將其註銷了。

  • 通知中心NSNotificationCenter,通知的樞紐。

  • 被觀察的對象,經過postNotificationName:object:userInfo:發送某一類型通知,廣播改變。

  • 通知對象NSNotification,當有通知來的時候,Center會調用觀察者註冊的接口來廣播通知,同時傳遞存儲着更改內容的NSNotification對象。

KVO

KVO的全稱是Key-Value Observer,即鍵值觀察。是一種沒有中心樞紐的觀察者模式的實現方式。一個主題對象管理全部依賴於它的觀察者對象,而且在自身狀態發生改變的時候主動通知觀察者對象。

  • 註冊觀察者

[object addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew context:]。

  • 更改主題對象屬性的值,即觸發發送更改的通知。

  • 在制定的回調函數中,處理收到的更改通知。

  • 註銷觀察者 [object removeObserver:self forKeyPath:property]。

3、在一個https鏈接的網站裏,輸入帳號密碼點擊登陸後,到服務器返回這個請求前,中間經歷了什麼

這題是在其餘看到的,原本題目是登陸gmail的時候,可是國內也許有些人不知道Google很早就全站https了,因此這裏特別指出是https的鏈接。

這裏面能夠談的東西就不少了,TCP/IP下有很是多的協議。不須要什麼都能說的清楚,可是對於整個網絡鏈接模型的理解能夠看出基本功。

解答:

 

 

HTTPS加密流程

  • 客戶端會打包一個請求,包括url,端口啊,你的帳號密碼等等。帳號密碼登錄應該用的是Post方式,因此相關的用戶信息會被加載到body裏面。這個請求應該包含三個方面:網絡地址,協議,資源路徑。注意,這裏是HTTPS,就是HTTP + SSL / TLS,在HTTP上又加了一層處理加密信息的模塊(至關因而個鎖)。

  • 通常會先請求DNS服務器。DNS服務器負責將你的網絡地址解析成IP地址,這個IP地址對應網上一臺機器。這其中可能發生Hosts Hijack和ISP failure的問題。

  • 協議是獲取資源的方式HTTP,FTP,UDP,不一樣協議有不一樣的格式,有些是process-to-process的,有些是host-to-host的。

  • 客戶端會和服務器的端口之間創建一個socket鏈接,socket通常都是以file descriptor的方式解析請求。

  • 服務器端接收到請求。服務器端會有一套數字證書(至關因而個鑰匙),這個證書會先返回給客戶端。客戶端會解析證書,至關於用鑰匙(證書)把鎖(內容)鎖上(生成私匙),接着再傳送加密信息。

  • 服務器端接收到加密信息(私匙)以後,會進行解密,並把要返回的數據進行對稱加密返回到客戶端。假如路徑不對,會出現404的錯誤。

  • 通常訪問服務器以前可能會訪問一下proxy。這玩意是個代理,有時候當防火牆用,有時候當cache使。若是後臺是reverse-proxy結構,那麼實際上有多個web服務器藏在proxy以後按需處理請求,而你訪問的永遠是proxy,這樣能夠解決過載問題。

  • 有時候訪問完web服務器後還要訪問一下file服務器,主要是請求數據庫裏的一些信息。

  • 服務器將相應打包,直接或經過proxy(大多數時候)返回給客戶端。客戶端會用剛剛生成的私匙進行解密,將內容顯示在瀏覽器上。

  • HTTPS加密過程詳解請去https原理:證書傳遞、驗證和數據加密、解密過程解析

4、在一個app中間有一個button,在你手觸摸屏幕點擊後,到這個button收到點擊事件,中間發生了什麼

unloop和響應鏈須要說的清楚。

有時還會順便問問UIResponder、UIControl、UIView的關係。

解答:

 

響應鏈大概有如下幾個步驟:

  • 設備將touch到的UITouch和UIEvent對象打包, 放到當前活動的Application的事件隊列中

  • 單例的UIApplication會從事件隊列中取出觸摸事件並傳遞給單例UIWindow

  • UIWindow使用hitTest:withEvent:方法查找touch操做的所在的視圖view

RunLoop這邊我大概講一下:

  • 主線程的RunLoop被喚醒

  • 通知Observer,處理Timer和Source 0

  • Springboard接受touch event以後轉給App進程

  • RunLoop處理Source 1,Source1 就會觸發回調,並調用_UIApplicationHandleEventQueue() 進行應用內部的分發。

  • RunLoop處理完畢進入睡眠,此前會釋放舊的autorelease pool並新建一個autorelease pool

相關文章
相關標籤/搜索