iOS--面試劃重點了

一、關于@property先思考一下幾個問題

delegate 屬性為什么使用 weak ?
xib/storybard連接的對象為什么使用weak?
字符串  為什么使用copy?
Block 為什么使用 copy?
1.答:delegate用weak修飾是為了避免循環引用
2.答:因為控件他“爹”view.superview已經strong reference(牽著他
滴小手了),你的viewController 只需要weak reference就好了
3.答:因為通常都是使用copy的方式。雖然使用strong也沒有沒有
問題,但是事實上在開發中都會使用copy。為什么這么做?因為對
于字符串,我們希望是一次內容的拷貝,外部修改也不會影響我們
的原來的值,而且NSString類遵守了NSCopying, 
NSMutableCopying, NSSecureCoding協議。
4.答:block一開始是放在棧上的,只有copy后才會放到堆上

@Property是聲明屬性的語法,它可以快速方便的為實例變量創建存取器,并允許我們通過點語法使用存取器。

  • 存取器(accessor):指用于獲取和設置實例變量的方法。用于獲取實例變量值的存取器是getter,用于設置實例變量值的存取器是setter。
  • @property等同于在.h文件中聲明實例變量的get/set方法,@synthesize等同于在.m文件中實現實例變量的get/set方法。使用@property和synthesize創建存取器要比手動聲明兩個存取方法(getter和setter)更簡單。而且我們在使用屬性時可以使用點語法賦值或取值,語法更簡單,更符合面向對象編程。
  • @property還有一些關鍵字,它們都是有特殊作用的,比如上述代碼中的nonatomic,strong。我把它們分為三類,分別是:原子性,存取器控制,內存管理。
原子性

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

存取器控制

readwrite(默認):readwrite是默認值,表示該屬性同時擁有setter和getter。
readonly: readonly表示只有getter沒有setter。

內存管理

assign(默認):assign用于值類型,如int、float、double和NSInteger,CGFloat等表示單純的復制。還包括不存在所有權關系的對象,比如常見的delegate。
retain:在setter方法中,需要對傳入的對象進行引用計數加1的操作。簡單來說,就是對傳入的對象擁有所有權,只要對該對象擁有所有權,該對象就不會被釋放。(現在基本不用因為都是ARC機制)如下代碼所示:

- (void)setName:(NSString *)_name
{ 
   //首先判斷是否與舊對象一致,如果不一致進行賦值。
   //因為如果是一個對象的話,進行if內的代碼會造成一個極端的情況:當此name的retain為1時,使此次的set操作讓實例name提前釋放,而達不到賦值目的。 
    if ( name != _name){
           [name release];
           name = [_name retain];
     } 
}

strong:strong是在iOS引入ARC的時候引入的關鍵字,是retain的一個可選的替代。表示實例變量對傳入的對象要有所有權關系,即強引用.

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

二、RunTime

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

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

這塊太大了,可以參考:
Runtime簡介及應用詳解

三、RunLoop

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

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

四、NSThread、NSOperation、GCD

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

五、Block、Delegate、Notification

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

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

一張圖看出TCP和UDP的區別:

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

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

GET和POST的區別
  • HTTP: 超文本傳輸協議,是短連接,是客戶端主動發送請求,服務器做出響應,服務器響應之后,鏈接斷開。HTTP是一個屬于應用層面向對象的協議,HTTP有兩類報文:請求報文和響應報文。

  • HTTP請求報文:一個HTTP請求報文由請求行、請求頭部、空行和請求數據4部分組成。

  • HTTP響應報文:由三部分組成:狀態行、消息報頭、響應正文。

  • GET:GET請求:參數在地址后拼接,沒有請求數據,不安全(因為所有參數都拼接在地址后面),不適合傳輸大量數據(長度有限制,為1024個字節)。GET提交、請求的數據會附在URL之后,即把數據放置在HTTP協議頭中。

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

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

HTTPS:安全超文本傳輸協議(Secure Hypertext Transfer Protocol),它是一個安全通信通道,基于HTTP開發,用于客戶計算機和服務器之間交換信息,使用安全套結字層(SSI)進行信息交換,即HTTP的安全版。
詳情可看
阮一峰的網絡日志

七、簡述內存分區情況

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

C中的malloc函數分配的內存空間是在堆上的,C++中對應的是new操作符。 
程序在編譯期對變量和函數分配內存都在棧上進行,且程序運行過程中函數調用時參數的傳遞也在棧上。
區分下面指針的不同
const char *p;
char const *p;
char * const p;
const char * const p;
* const char *p定義了一個指向不可變的字符串的字符指針,可以這么看:const char *為類型,p是變量。
* char const *p與上一個是一樣的。
* char * const p定義了一個指向字符串的指針,該指針值不可改變,即不可改變指向。這么看:char *是類型,const是修飾變量p,也就是說p是一個常量
* const char * const p定義了一個指向不可變的字符串的字符指針,且該指針也不可改變指向。這一個就很容易看出來了。兩個const分別修飾,因此都是不可變的。
面試中當然還會出現其他各式各樣的問題,以上是我整理的,如有錯誤,歡迎指出。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,333評論 11 349
  • 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經供過于求了。今年,找過工作的人可能會更深刻地體會到今年的就...
    有夢想的老伯伯閱讀 3,017評論 3 96
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,197評論 30 471
  • 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經到供過于求了。今年,找過工作人可能會更深刻地體會到今年的就...
    Jack_lin閱讀 78,486評論 110 1,946
  • OC的理解與特性OC作為一門面向對象的語言,自然具有面向對象的語言特性:封裝、繼承、多態。它既具有靜態語言的特性(...
    LIANMING_LI閱讀 533評論 0 0