iOS 面試

一、main()c++

{ int a[5]={1,2,3,4,5};git

int *ptr=(int*)(&a+1);程序員

printf("%d,%d",*(a+1),*(ptr-1));編程

}json

第一個:2,a指向數組首地址a[1]=2;swift

第二個:a是一個數組名,也就是數組的首地址。設計模式

對a進行取地址運算符,獲得的是一個指向數組的指針!!!!這句話尤其重要!也就至關於數組

int (*p) [5] = &a;p是一個指針,它指向的是一個包含5個int元素的數組!!安全

那麼執行p+1後,p的偏移量至關於 p + sizeof(int) * 5,而程序中強制將指針p轉換成一個int* 那麼 p -1 其實就是 p - sizeof(int)因此,p -1 指向了數組中得最後一個元素,也就是 5服務器

二、oc沒有多重繼承,是用協議(protocol)來代替

三、oc類裏面的方法只有兩種,靜態方法和實例方法,全部實例變量都是默認私有的,全部實例方法默認都是共有的。

四、const意味着「只讀」,const int a;int const a;聲明只讀的整型變量a,

const int *a;a是一個指向長整型數的指針,整型數不可修改,但指針能夠修改

int* const a;a是一個指向整型數的長指針,整型數可修改,但指針不可修改

int const* a const;a是一個指向長整型數的長指針,都不可修改

阻止變量被修改,使用const關鍵字

對指針來講,能夠指定指針自己爲const,也可指定指針所指的數據爲const,或兩者同時爲const

在一個函數聲明中,const能夠修飾形參,代表它是一個輸入參數,在函數內部不能改變其值

對於類的成員函數,若指定其爲const類型,則代表其是一個常函數,不能修改類的成員變量

五、static的做用

   函數體內static變量的 做用範圍是該函數體,不一樣於auto變量,該變量的內存只被分配一次,所以其值在下次調用時仍維持上次的值。

  在模塊內的static全局變量能夠被模塊內全部函數訪問,但不能被模塊外的其餘函數訪問。

  在模塊內的static函數只可被這一模塊的其餘函數調用,這個函數的使用範圍被限制在聲明它的模塊內。

  在類中的static成員變量屬於整個類所擁有,對類的全部對象只有一份拷貝

  在類中的static成員函數屬於整個類所擁有,這個函數不接收this指針,所以只能訪問類的static成員變量

六、extern"C"的做用

   被它限定的函數或變量是extern類型的

   被它修飾的變量和函數是按照c語言方式編譯和鏈接的

七、#import,#include的區別,@class呢?

  @class通常用於頭文件中須要聲明該類的某個實例變量的時候用到,在m文件中仍是須要使用#import,#import比#include的好處是不會引發交叉編譯

八、oc的優勢 cateogies, Posing, 動態識別,指標計算,彈性訊息快遞、不是過分複雜的c衍生語言,可與c++混合編程

九、命名空間:不支援命名空間,不支持運算符重載,不支持多重繼承,使用動態運行時的類型,都是函數調用,不少編譯時的優化方法用不到

十、內存管理

 十一、自動釋放池

十二、堆和棧

對於棧來說,是由編譯器自動管理,對於堆來講,釋放工做由程序員控制,容易產生內存泄漏

棧在widows系統下,是向低地址擴展的數據結構,是一塊連續的內存區域,能從棧得到的空間較小

堆:堆事向高地址擴展的數據結構,是不連續的內存區域,得到空間比較靈活,也比較大。

區別:碎片問題:對於堆來說,頻繁的new/delete會形成內存空間的不連續,從而形成大量碎片,使程序效率下降。對於棧來說,由於棧是先進後出的隊列,以致於永遠不可能有一個內存塊從棧中間彈出

分配方式:堆是動態分配的,棧有兩種分配方式:靜態分配和動態分配

分配效率:棧是機器系統提供的數據結構,計算機底層對棧提供支持,堆是c/c++函數庫提供的,它的機制是很複雜的

十二、swift新特性

  支持全部c和oc的基本類型

  提供了兩種功能強勁的集合類型-Array和Dictionary

  支持一種新的高級類型-元組

  可選類型

  支持閉包的特性

  支持腳本語言的特性,能高效地編譯運行

 

中級:

一、mvc

二、線程和進程

  二者關係:

  一個線程只屬於一個進程,而一個進程能夠有多個線程,但至少有一個線程

  資源分配給進程,同一進程的全部線程共享該進程的全部資源

  線程在執行過程當中,須要協做同步。不一樣進程的線程之間利用消息通訊的辦法實現同步

  真正在處理機上運行的是線程

  線程是指進程內的一個可執行單元,也是進程內的可調度實體

二者區別:

  調度:線程做爲調度和分配的基本單元,進程做爲擁有資源的基本單位

  併發性:不只進程之間能夠併發執行,同一個進程的多個線程之間也能夠併發執行

  擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但能夠訪問隸屬進程的資源

  系統開銷:建立、撤銷進程的開銷比較大

三、進程的同步機制

   原子操做、信號量機制、自旋鎖、分佈式系統等

四、進程死鎖的緣由

  資源競爭以及進程推動順序非法

五、死鎖的4個必要條件

  互斥、請求保持、不可剝奪、環路

六、死鎖處理

  鴕鳥策略、預防策略、檢測與解除死鎖

七、KVC和KVO

  KVC:鍵值編碼,是一種間接訪問對象實例變量的機制,該機制能夠不經過存取方法就能夠訪問對象的實例變量

  KVO: 鍵值監聽,是一種使得對象獲取其餘對象屬性變化的機制

  實現KVO模式,被觀察的對象必須使用KVC鍵值編碼來修改它的實例變量,這樣才能被監聽

八、深複製、淺複製

  深複製:不只複製對象自己,對象持有的屬性對象也作複製

  淺複製:只複製對象自己,不對裏面的屬性複製

九、assign、retain、copy、nonatomic

   assign:普通賦值,通常用於基本數據類型,常見委託設計模式,以防止循環引用

   retain:保留計數,得到對象的全部權,引用計數在原有基礎上加1

   copy:通常字符串使用copy。Foundation中的不可變對象使用copy效果至關於retain,只是引用計數+1

   nonatomic:非原子性訪問,不加同步,多線程併發訪問會提升性能

十、ARC狀況下,strong與weak,_unsafe _unretained與weak的區別

 strong:強引用,weak:弱引用,在ARC中,使用strong告訴編譯器自動插入retain,weak至關於手動管理內存的assign

 _unsafe _unretained與weak功能一致,區別在於當指向的對象銷燬後,weak會將變量置爲nil,防止調用野指針

十一、ARC存在內存泄漏嗎?

  循環引用致使內存泄漏,oc對象與CoreFoundation類之間橋接時,管理不當也會產生內存泄漏

十二、事件響應者鏈

   響應者鏈表示一系列的響應者對象。事件被交由第一響應者對象處理,若是第一響應者不處理,事件被沿着響應者鏈向上傳遞,交給下一個響應者(next responder)

view->viewcontroller->window->application->丟棄事件

1三、svn、git使用

1四、打包靜態庫

1五、App發佈上架流程

1六、storyboard的使用

高級:

一、CALayer與UIView的區別?

二者的最大區別就是,圖層(CALayer)不會直接渲染到屏幕上。uiview是iOS系統中界面元素的基礎,全部的界面元素都繼承自它。它自己是由CoreAnimation來實現的。真正的繪圖部分由一個CALayer類來管理。一個uiview上能夠有n個CALayer,每一個layer顯示一種東西,加強uiview的展示能力

二、GCD

  GCD是apple開發的一個多核編程的較新的解決辦法

 是一個替代諸如NSThread等技術的很高效和強大的技術,徹底能夠處理如數據鎖定、資源泄漏等複雜的一步編程問題

  擴展知識:(操做隊列、異步,同步)

三、TCP和UDP

 TCP:傳輸控制協議,提供面向鏈接的、可靠的、點對點的通訊

 UDP:用戶數據報協議,提供非鏈接的,不可靠的點到多點的通訊

四、socket鏈接和http鏈接

 http:短鏈接,客戶端項服務端發送一次請求,服務端響應鏈接即會斷掉

 socket:長鏈接,一旦創建不會主動斷掉

五、TCP的三次握手

  第一次:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等服務器確認

  第二次:服務器端收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN(syn=k)即SYN+ACK包,此時服務器進入SYN_RECV狀態

  第三次:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務端進入ESTABLISHED,完成三次握手

六、iOS對象通訊方式

  代理、block、通知、KVO

七、http,https

   短鏈接,都是客戶端主動發送請求,服務器做出響應,而後斷開。GET沒有請求體,POST有請求體

https:安全超文本傳輸協議。使用安全套接字層(SSL)進行信息交換

八、xml與json數據解析

  XML解析方式:DOM解析和SAX解析

  DOM解析必須先完成DOM樹的構造,在處理規模較大的XML文檔時很耗內存,佔用資源比較多

 SAX是用事件驅動模型,解析XML文檔時每遇到一個開始或者結束標籤、屬性或者一條指令,程序就產生一個事件來進行相應的處理。SAX更適合較大的文檔

json解析比較好用的是第三方的JSONKIT和iOS自帶的json解析類

九、taleview的複用,設計模式

十、core Data

十一、斷點續傳

十二、Core開頭的系列內容,CoreAnimation和CoreGraphics,分別使用CA和CG作過什麼動畫或者圖像上的內容

相關文章
相關標籤/搜索