iOS 面試基礎題

來源:互聯網
上載者:User

標籤:

1.UIWindow和UIView和 CALayer 的聯絡和區別?

答:UIView是視圖的基類,UIViewController是視圖控制器的基類,UIResponder是表示一個可以在螢幕上響應觸摸事件的對象;

UIwindow是UIView的子類,UIWindow的主要作用:一是提供一個地區來顯示UIView,二是將事件(event)的分發給UIView,一個應用基本上只有一個UIWindow.

萬物歸根,UIView和CALayer都是的老祖都是NSObjet。可見 UIResponder是用來響應事件的,也就是UIView可以響應使用者事件。

CALayer 和 UIView 的區別:

1.1 UIView的繼承結構為: UIResponder : NSObject。

CALayer的繼承結構為: NSObject。可見 UIResponder是用來響應事件的,也就是UIView可以響應使用者事件,CALayer直接從 NSObject繼承,因為缺少了UIResponder類,不能響應任何使用者事件

1.2 所屬架構,UIView是在 /System/Library/Frameworks/UIKit.framework中定義的,UIKit主要是用來構建使用者介面,並且是可以響應事件的。CALayer是在/System/Library/Frameworks/QuartzCore.framework定義的。而且CALayer作為一個低級的,可以承載繪製內容的底層對象出現在該架構中。

1.3 UIView相比CALayer最大區別是UIView可以響應使用者事件,而CALayer不可以。UIView側重於對顯示內容的管理,CALayer側重於對內容的繪製。UIView是基於CALayer的高層封裝。

1.4 相似支援1:相似的樹形結構2:顯示內容繪製方式3: 布局約束

總結一下就是:UIView是用來顯示內容的,可以處理使用者事件.CALayer是用來繪製內容的,對內容進行動畫處理依賴與UIView來進行顯示,不能處理使用者事件

為啥有兩套體系 並不是兩套體系?UIView和CALayer是相互依賴的關係。UIView依賴與calayer提供的內容,CALayer依賴uivew提供的容器來顯示繪製的內容。歸根到底CALayer是這一切的基礎,如果沒有CALayer,UIView自身也不會存在,UIView是一個特殊的CALayer實現,添加了響應事件的能力。UIView本身,更像是一個CALayer的管理器,訪問它的跟繪圖和跟座標有關的屬性,例如frame,bounds等等,實際上內部都是在訪問它所包含的CALayer的相關屬性。

UIView的layer樹形在系統內部,被系統維護著三份copy(這段理解有點吃不準)。

第一份,邏輯樹狀結構,就是代碼裡可以操縱的,例如更改layer的屬性等等就在這一份。

第二份,動畫樹,這是一個中介層,系統正在這一層上更改屬性,進行各種渲染操作。

第三份,顯示樹,這棵樹的內容是當前正被顯示在螢幕上的內容。

這三棵樹的邏輯結構都是一樣的,區別只有各自的屬性。

UIView的主layer以外,對它的subLayer,也就是子layer的屬性變更,系統將自動進行動畫產生。

CALayer的座標系系統和UIView有點不一樣,它多了一個叫anchorPoint的屬性,它使用CGPoint結構,但是範圍是0~1,也就是按照比例來設定。這個點是各種圖形變換的座標原點,同時會更改layer的position的位置,它的預設值是{0.5, 0.5},也就是在layer的中央。

哈哈,這下夠說一壺的了把,雖然說完感覺其實沒什麼卵用,但是記住一定要說的繪聲繪色。

參考連結如下:

  • http://o0o0o0o.iteye.com/blog/1728599
  • http://www.cnblogs.com/pengyingh/articles/2381673.html

2. property 都有哪些常見的欄位

strong,weak,retain,assign,copy nomatic,readonly,

3. strong,weak,retain,assign,copy nomatic 等的區別。

assign: 簡單賦值,不更改索引計數(Reference Counting)對基礎資料類

copy: 建立一個索引計數為1的對象,然後釋放舊對象。對NSString

retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1 ,對其他NSObject和其子類

weak 和strong的區別:weak和strong不同的是 當一個對象不再有strong類型的指標指向它的時候 它會被釋放 ,即使還有weak型指標指向它。一旦最後一個strong型指標離去 ,這個對象將被釋放,所有剩餘的weak型指標都將被清除。

copy與retain:

copy其實是建立了一個相同的對象,而retain不是.

copy是內容拷貝,retain是指標拷貝.

copy是內容的拷貝 ,對於像NSString,的確是這樣,如果拷貝的是 NSArray這時只是copy了指向array中相對應元素的指標.這便是所謂的"淺複製".

atomic是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成資料錯誤。而這種機制是耗費系統資源的,所以在iPhone這種小型裝置上,如果沒有使用多線程間的通訊編程,那麼nonatomic是一個非常好的選擇。

對於 NSString 為什麼使用 copy 參考這篇連結

  • http://southpeak.github.io/blog/2015/05/10/ioszhi-shi-xiao-ji-di-%5B%3F%5D-qi-2015-dot-05-dot-10/

4.__block和__weak修飾符的區別:

__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基礎資料型別 (Elementary Data Type)。

__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基礎資料型別 (Elementary Data Type)(int)。

__block對象可以在block中被重新賦值,__weak不可以。

5.常見的 Http 狀態代碼有哪些?

http狀態嗎 :302 是請求重新導向。500以上是伺服器錯誤。400以上是請求連結錯誤或者找不到伺服器。200以上是正確。100以上是請求接受成功。

2-3問題參考連結 http://zhangmingwei.iteye.com/blog/1748431

6.單例的寫法。在單例中使用數組要注意什嗎?

1

2

3

4

5

6

7

8

9

static PGSingleton *sharedSingleton;

+ (instancetype)sharedSingleton

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        sharedSingleton = [[PGSingleton alloc] init];

    });

    return sharedSingleton;

}

其實上面的還不是標準的單例方法,標準的單例方法需要重寫 copyWithZone,allocWithZone,init,確保以任何方式建立出來的對象只有一個,這裡就不詳細寫了。

單例使用 NSMutableArray 的時候,防止多個地方對它同時遍曆和修改的話,需要加原子屬性。並且property用strong,並且寫一個遍曆和修改的方法。加上鎖. Lock,UnLock.(PS:考慮效能問題盡量避免使用鎖,在蘋果的文檔張看到的不要問我為什麼,我也忘了自己查去。。)

關於單例的參考,和不要濫用單例的參考

  • http://www.jianshu.com/p/7486ebfcd93b
  • http://blog.codingcoder.com/singletons/

7.static 關鍵字的作用

1.函數體內 static 變數的作用範圍為該函數體,不同於 auto 變數,該變數的記憶體只被分配一次,

因此其值在下次調用時仍維持上次的值;

2.在模組內的 static 全域變數可以被模組內所用函數訪問,但不能被模組外其它函數訪問;

3.在模組內的 static 函數只可被這一模組內的其它函數調用,這個函數的使用範圍被限制在聲明 它的模組內;

4.在類中的 static 成員變數屬於整個類所擁有,對類的所有對象只有一份拷貝;

5.在類中的 static 成員函數屬於整個類所擁有,這個函數不接收 this 指標,因而只能訪問類的static 成員變數。

8.iOS 中的事件的傳遞:響應鏈

簡要說一下:

事件沿著一個指定的路徑傳遞直到它遇見可以處理它的對象。 首先一個UIApplication 對象從隊列頂部擷取一個事件並分發(dispatches)它以便處理。 通常,它把事件傳遞給應用程式的關鍵視窗對象,該對象把事件傳遞給一個初始對象來處理。 初始對象取決於事件的類型。

觸摸事件。 對於觸摸事件,視窗對象首先嘗試把事件傳遞給觸摸發生的視圖。那個視圖被稱為hit-test(點擊測試)視圖。 尋找hit-test視圖的過程被稱為hit-testing, 參見 “Hit-Testing Returns the View Where a Touch Occurred.”

運動和遠端控制事件。 對於這些事件,視窗對象把shaking-motion(搖晃運動)或遠端控制事件傳遞給第一響應者來處理。第一響應者請參見 “The Responder Chain Is Made Up of Responder Objects.”

iOS 使用hit-testing來找到事件發生的視圖。 Hit-testing包括檢查觸摸事件是否發生在任何相關視圖對象的範圍內, 如果是,則遞迴地檢查所有視圖的子視圖。在視圖層次中的最底層視圖,如果它包含了觸摸點,那麼它就是hit-test視圖。等 iOS決定了hit-test視圖之後,它把觸摸事件傳遞給該視圖以便處理。

參考連結:http://yishuiliunian.gitbooks.io/implementate-tableview-to-understand-ios/content/uikit/132event-chains.html

9.堆和棧的區別

管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式員控制,容易產生memory leak。

申請大小:

棧:在Windows下,棧是向低地址擴充的資料結構,是一塊連續的記憶體的地區。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時間就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆:堆是向高地址擴充的資料結構,是不連續的記憶體地區。這是由於系統是用鏈表來儲存的空閑記憶體位址的,自然是不連續的,而鏈表的遍曆方向是由低地址向高地址。堆的大小受限於電腦系統中有效虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

片段問題:對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的片段,使程式效率降低。對於棧來講,則不會存在這個問題,因為棧是先進後出的隊列,他們是如此的一一對應,以至於永遠都不可能有一個記憶體塊從棧中間彈出

分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變數的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。

分配效率:棧是機器系統提供的資料結構,電腦會在底層對棧提供支援:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。

iOS 面試基礎題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.