iOS--面試劃重點(diǎn)了

一、關(guān)于@property先思考一下幾個(gè)問題

delegate 屬性為什么使用 weak ?
xib/storybard連接的對象為什么使用weak?
字符串  為什么使用copy?
Block 為什么使用 copy?
1.答:delegate用weak修飾是為了避免循環(huán)引用
2.答:因?yàn)榭丶暗眝iew.superview已經(jīng)strong reference(牽著他
滴小手了),你的viewController 只需要weak reference就好了
3.答:因?yàn)橥ǔ6际鞘褂胏opy的方式。雖然使用strong也沒有沒有
問題,但是事實(shí)上在開發(fā)中都會使用copy。為什么這么做?因?yàn)閷?于字符串,我們希望是一次內(nèi)容的拷貝,外部修改也不會影響我們
的原來的值,而且NSString類遵守了NSCopying, 
NSMutableCopying, NSSecureCoding協(xié)議。
4.答:block一開始是放在棧上的,只有copy后才會放到堆上

@Property是聲明屬性的語法,它可以快速方便的為實(shí)例變量創(chuàng)建存取器,并允許我們通過點(diǎn)語法使用存取器。

  • 存取器(accessor):指用于獲取和設(shè)置實(shí)例變量的方法。用于獲取實(shí)例變量值的存取器是getter,用于設(shè)置實(shí)例變量值的存取器是setter。
  • @property等同于在.h文件中聲明實(shí)例變量的get/set方法,@synthesize等同于在.m文件中實(shí)現(xiàn)實(shí)例變量的get/set方法。使用@property和synthesize創(chuàng)建存取器要比手動聲明兩個(gè)存取方法(getter和setter)更簡單。而且我們在使用屬性時(shí)可以使用點(diǎn)語法賦值或取值,語法更簡單,更符合面向?qū)ο缶幊獭?/li>
  • @property還有一些關(guān)鍵字,它們都是有特殊作用的,比如上述代碼中的nonatomic,strong。我把它們分為三類,分別是:原子性,存取器控制,內(nèi)存管理。
原子性

1、atomic(默認(rèn)):atomic意為操作是原子的,意味著只有一個(gè)線程訪問實(shí)例變量。atomic是線程安全的,至少在當(dāng)前的存取器上是安全的。
2、nonatomic:nonatomic跟atomic剛好相反。表示非原子的,可以被多個(gè)線程訪問。它的效率比atomic快。但不能保證在多線程環(huán)境下的安全性,在單線程和明確只有一個(gè)線程訪問的情況下廣泛使用。

存取器控制

readwrite(默認(rèn)):readwrite是默認(rèn)值,表示該屬性同時(shí)擁有setter和getter。
readonly: readonly表示只有g(shù)etter沒有setter。

內(nèi)存管理

assign(默認(rèn)):assign用于值類型,如int、float、double和NSInteger,CGFloat等表示單純的復(fù)制。還包括不存在所有權(quán)關(guān)系的對象,比如常見的delegate。
retain:在setter方法中,需要對傳入的對象進(jìn)行引用計(jì)數(shù)加1的操作。簡單來說,就是對傳入的對象擁有所有權(quán),只要對該對象擁有所有權(quán),該對象就不會被釋放。(現(xiàn)在基本不用因?yàn)槎际茿RC機(jī)制)如下代碼所示:

- (void)setName:(NSString *)_name
{ 
   //首先判斷是否與舊對象一致,如果不一致進(jìn)行賦值。
   //因?yàn)槿绻且粋€(gè)對象的話,進(jìn)行if內(nèi)的代碼會造成一個(gè)極端的情況:當(dāng)此name的retain為1時(shí),使此次的set操作讓實(shí)例name提前釋放,而達(dá)不到賦值目的。 
    if ( name != _name){
           [name release];
           name = [_name retain];
     } 
}

strong:strong是在iOS引入ARC的時(shí)候引入的關(guān)鍵字,是retain的一個(gè)可選的替代。表示實(shí)例變量對傳入的對象要有所有權(quán)關(guān)系,即強(qiáng)引用.

weak:在setter方法中,需要對傳入的對象不進(jìn)行引用計(jì)數(shù)加1的操作。簡單來說,就是對傳入的對象沒有所有權(quán),當(dāng)該對象引用計(jì)數(shù)為0時(shí),即該對象被釋放后,用weak聲明的實(shí)例變量指向nil,即實(shí)例變量的值為0。
copy:與strong類似,但區(qū)別在于實(shí)例變量是對傳入對象的副本擁有所有權(quán),而非對象本身。

二、RunTime

1、RunTime簡稱運(yùn)行時(shí),就是系統(tǒng)在運(yùn)行的時(shí)候的一些機(jī)制,其中最主要的是消息機(jī)制。
2、對于C語言,函數(shù)的調(diào)用在編譯的時(shí)候會決定調(diào)用哪個(gè)函數(shù),編譯完成之后直接順序執(zhí)行,無任何二義性。
3、OC的函數(shù)調(diào)用成為消息發(fā)送。屬于動態(tài)調(diào)用過程。在編譯的時(shí)候并不能決定真正調(diào)用哪個(gè)函數(shù)(事實(shí)證明,在編 譯階段,OC可以調(diào)用任何函數(shù),即使這個(gè)函數(shù)并未實(shí)現(xiàn),只要申明過就不會報(bào)錯(cuò)。而C語言在編譯階段就會報(bào)錯(cuò))。
4、只有在真正運(yùn)行的時(shí)候才會根據(jù)函數(shù)的名稱找 到對應(yīng)的函數(shù)來調(diào)用。

  • 常用在我們代碼中的具體情況
 * 動態(tài)的添加對象的成員變量和方法
 * 動態(tài)交換兩個(gè)方法的實(shí)現(xiàn)
 * 攔截并替換方法
 * 在方法上增加額外功能
 * 實(shí)現(xiàn)NSCoding的自動歸檔和解檔
 * 實(shí)現(xiàn)字典轉(zhuǎn)模型的自動轉(zhuǎn)換

這塊太大了,可以參考:
Runtime簡介及應(yīng)用詳解

三、RunLoop

  • RunLoop是什么呢?我們手機(jī)應(yīng)用是事件驅(qū)動的整體架構(gòu),假如我們程序一直活著,如果沒事就閑著,如果有什么事件把它喚醒,然后它就去分配執(zhí)行事件,直到死了,才退出。 RunLoop是線程的基礎(chǔ)架構(gòu)部分,每一個(gè) 線程都有著對應(yīng)的 run loop 對象。 它用來接受循環(huán)中的事件和安排線程工作,并在沒有工作時(shí),讓線程進(jìn)入睡眠狀態(tài)。
RunLoop的作用
1、使程序一直運(yùn)行并接受用戶輸入
2、決定程序在何時(shí)應(yīng)該處理那些事件 (Event)
3、調(diào)用解耦 (Message Queue)---- 主調(diào)方 和 被調(diào)方,消息隊(duì)列如何安排
4、節(jié)省CPU時(shí)間 ---- 沒事的時(shí)候就閑著
RunLoop的 mode 類型
NSDefaultRunLoopMode :默認(rèn)狀態(tài)下,不滑動,空閑狀態(tài),程序啟動之后就會被切到這個(gè)mode 
UITrackingRunLoopMode : 滑動的時(shí)候
UIInitializationRunLoopMode:私有的,可以追蹤到的,這個(gè)app啟動的時(shí)候是這個(gè)mode,第一個(gè)頁面加載之后才回到第一個(gè)mode
NSRunLoopCommonModes:默認(rèn)情況包括下第一個(gè)第二個(gè),在這種情況下就是這兩種情況都可以執(zhí)行

詳情可看
孫源@sunnyxx視頻 RunLoop 介紹
YYKit 作者 深入理解RunLoop

四、NSThread、NSOperation、GCD

  • iOS有三種多線程編程的技術(shù),這三種編程方式從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單,也是Apple最推薦使用的。
  • NSThread :NSThread 輕量級最低,相對簡單,但是需要手動管理所有的線程活動,如生命周期、線程同步、睡眠等
  • NSOperation : 自帶線程周期管理,操作上可更注重自己邏輯,但是面向?qū)ο蟮某橄箢?,只能?shí)現(xiàn)它或者使用它定義好的兩個(gè)子類:
    NSInvocationOperation 和 NSBlockOperation。
  • GCD: 最高效,避開并發(fā)陷阱.
    所以一般簡單而安全的選擇NSOperation實(shí)現(xiàn)多線程即可。而處理大量并發(fā)數(shù)據(jù),又追求性能效率的選擇GCD。
    詳情參考:
    多線程簡介
    創(chuàng)建線程
    線程安全
    線程通信
    線程狀態(tài)
    GCD(1)
    GCD(2)

五、Block、Delegate、Notification

  • Delegate:“一對一”,對同一個(gè)協(xié)議,一個(gè)對象只能設(shè)置一個(gè)代理delegate,所以單例對象就不能用代理。
  • Notification:“一對多”,在APP中,很多控制器都需要知道一個(gè)事件,應(yīng)該用通知;但是通知需要及時(shí)刪除。
  • Block:寫法更簡練,block注重結(jié)果的傳輸:比如對于一個(gè)事件,只想知道成功或者失敗,并不需要知道進(jìn)行了多少或者額外的一些信息。block需要注意防止循環(huán)引用。
    代理的使用
    通知廣播的使用
    Block的使用(1)
    Block的使用(2)

六、UDP、TCP、Socket、HTTP、POST、GET

一張圖看出TCP和UDP的區(qū)別:

TCP與UDP區(qū)別.png
  • TCP為傳輸控制層協(xié)議,為面向連接、可靠的、點(diǎn)到點(diǎn)的通信;
  • UDP為用戶數(shù)據(jù)報(bào)協(xié)議,非連接的不可靠的點(diǎn)到多點(diǎn)的通信;
  • TCP側(cè)重可靠傳輸,UDP側(cè)重快速傳輸。
TCP連接的三次握手
 * 第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
 * 第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包,即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN+RECV狀態(tài);
 * 第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次狀態(tài)。
Scoket連接和HTTP連接的區(qū)別:

HTTP協(xié)議是基于TCP連接的,是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)。Socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API),通過Socket,我們才能使用TCP/IP協(xié)議。
HTTP連接:短連接,客戶端向服務(wù)器發(fā)送一次請求,服務(wù)器響應(yīng)后連接斷開,節(jié)省資源。服務(wù)器不能主動給客戶端響應(yīng)(除非采用HTTP長連接技術(shù)),iPhone主要使用類NSURLConnection。
Socket連接:長連接,客戶端跟服務(wù)器端直接使用Socket進(jìn)行連接,沒有規(guī)定連接后斷開,因此客戶端和服務(wù)器段保持連接通道,雙方可以主動發(fā)送數(shù)據(jù),一般多用于游戲.Socket默認(rèn)連接超時(shí)時(shí)間是30秒,默認(rèn)大小是8K(理解為一個(gè)數(shù)據(jù)包大?。?。

GET和POST的區(qū)別
  • HTTP: 超文本傳輸協(xié)議,是短連接,是客戶端主動發(fā)送請求,服務(wù)器做出響應(yīng),服務(wù)器響應(yīng)之后,鏈接斷開。HTTP是一個(gè)屬于應(yīng)用層面向?qū)ο蟮膮f(xié)議,HTTP有兩類報(bào)文:請求報(bào)文和響應(yīng)報(bào)文。

  • HTTP請求報(bào)文:一個(gè)HTTP請求報(bào)文由請求行、請求頭部、空行和請求數(shù)據(jù)4部分組成。

  • HTTP響應(yīng)報(bào)文:由三部分組成:狀態(tài)行、消息報(bào)頭、響應(yīng)正文。

  • GET:GET請求:參數(shù)在地址后拼接,沒有請求數(shù)據(jù),不安全(因?yàn)樗袇?shù)都拼接在地址后面),不適合傳輸大量數(shù)據(jù)(長度有限制,為1024個(gè)字節(jié))。GET提交、請求的數(shù)據(jù)會附在URL之后,即把數(shù)據(jù)放置在HTTP協(xié)議頭中。

  • POST: POST請求:參數(shù)在請求數(shù)據(jù)區(qū)放著,相對GET請求更安全,并且數(shù)據(jù)大小沒有限制。把提交的數(shù)據(jù)放置在HTTP包的包體中。

 * GET提交的數(shù)據(jù)會在地址欄顯示出來,而POST提交,地址欄不會改變。
 * GET請求能夠被緩存, POST請求不能被緩存下來。
 * GET請求會保存在瀏覽器的瀏覽記錄中,POST請求不會保存在瀏覽器瀏覽記錄中
 * GET提交時(shí),傳輸數(shù)據(jù)就會受到URL長度限制,POST由于不是通過URL傳值,理論上書不受限。
 * POST的安全性要比GET的安全性高;

HTTPS:安全超文本傳輸協(xié)議(Secure Hypertext Transfer Protocol),它是一個(gè)安全通信通道,基于HTTP開發(fā),用于客戶計(jì)算機(jī)和服務(wù)器之間交換信息,使用安全套結(jié)字層(SSI)進(jìn)行信息交換,即HTTP的安全版。
詳情可看
阮一峰的網(wǎng)絡(luò)日志

七、簡述內(nèi)存分區(qū)情況

* 代碼區(qū):存放函數(shù)二進(jìn)制代碼
* 數(shù)據(jù)區(qū):系統(tǒng)運(yùn)行時(shí)申請內(nèi)存并初始化,系統(tǒng)退出時(shí)由系統(tǒng)釋放,存放全局變量、靜態(tài)變量、常量
* 堆區(qū):通過malloc等函數(shù)或new等操作符動態(tài)申請得到,需程序員手動申請和釋放
* 棧區(qū):函數(shù)模塊內(nèi)申請,函數(shù)結(jié)束時(shí)由系統(tǒng)自動釋放,存放局部變量、函數(shù)參數(shù)
ps: 棧和堆的不同
棧的空間由操作系統(tǒng)自動分配/釋放,堆上的空間手動分配/釋放。
??臻g是有限的,而堆是很大的自由存儲區(qū)。

C中的malloc函數(shù)分配的內(nèi)存空間是在堆上的,C++中對應(yīng)的是new操作符。 
程序在編譯期對變量和函數(shù)分配內(nèi)存都在棧上進(jìn)行,且程序運(yùn)行過程中函數(shù)調(diào)用時(shí)參數(shù)的傳遞也在棧上。
區(qū)分下面指針的不同
const char *p;
char const *p;
char * const p;
const char * const p;
* const char *p定義了一個(gè)指向不可變的字符串的字符指針,可以這么看:const char *為類型,p是變量。
* char const *p與上一個(gè)是一樣的。
* char * const p定義了一個(gè)指向字符串的指針,該指針值不可改變,即不可改變指向。這么看:char *是類型,const是修飾變量p,也就是說p是一個(gè)常量
* const char * const p定義了一個(gè)指向不可變的字符串的字符指針,且該指針也不可改變指向。這一個(gè)就很容易看出來了。兩個(gè)const分別修飾,因此都是不可變的。
面試中當(dāng)然還會出現(xiàn)其他各式各樣的問題,以上是我整理的,如有錯(cuò)誤,歡迎指出。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,872評論 11 349
  • 序言 目前形勢,參加到iOS隊(duì)伍的人是越來越多,甚至已經(jīng)供過于求了。今年,找過工作的人可能會更深刻地體會到今年的就...
    有夢想的老伯伯閱讀 3,213評論 3 96
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,653評論 30 472
  • 序言 目前形勢,參加到iOS隊(duì)伍的人是越來越多,甚至已經(jīng)到供過于求了。今年,找過工作人可能會更深刻地體會到今年的就...
    Jack_lin閱讀 79,005評論 110 1,946
  • OC的理解與特性O(shè)C作為一門面向?qū)ο蟮恼Z言,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承、多態(tài)。它既具有靜態(tài)語言的特性(...
    LIANMING_LI閱讀 580評論 0 0

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