18年3月面試iOS小結(jié)

今年由于個人原因,有了換工作的想法蹄咖,所以把我整理的一些面試到的問題還有面試之前整理的問題都寫下來纠拔,就當(dāng)做一個備份。部分題目有自己整理的一個簡單的答題思路和步驟蜀铲,有不完整或錯誤的地方望指出边琉,話不多說,上題:

(1)https的原理

1 https是使用了 TSL(安全傳輸層)/SSL(安全套接字層)加密的HTTP協(xié)議
2 http在傳輸?shù)倪^程中是采用明文傳輸记劝,很容易被竊取或者被篡改數(shù)據(jù)变姨,而HTTPS的話是加入了身份認(rèn)證,信息加密厌丑,完整性驗證 HTTPS = HTTP + TSL/SSL
3 https總共涉及兩種加密方式和一種算法:非對稱加密(RSA)和對稱加密(AES)定欧,散列算法(MD5, 哈希)
4 https為了防止中間人的攻擊和消息抵賴的情況渔呵,采用了第三方機(jī)構(gòu)認(rèn)證的方式(即CA認(rèn)證的方式)來保證信息來源的正確性

(2)KVC和KVO的實現(xiàn)原理

KVC : key-value coding(鍵值編碼) 通過key值來獲取/設(shè)置對象的屬性通過字符串來獲取/設(shè)置對象的屬性,在查找的過程中砍鸠,比如:name扩氢,查找會查找 name, _name,getName,setName,isName等的屬性和方法, 如果找不到的話爷辱,最終會調(diào)用valueForUndefinedKey 或者 setValue:forUndefinedKey來進(jìn)行最后的處理录豺,如果沒有這兩個方法的實現(xiàn)的話,程序就會崩潰
accessInstanceVariablesDirectly -> 直接訪問實例變量
KVO: key-value observer (鍵值監(jiān)聽 isa-swizzing)
添加觀察的方法后饭弓,系統(tǒng)會給對應(yīng)的類添加一個子類双饥,并將該類的isa指針指向?qū)?yīng)的子類,子類重寫了對應(yīng)的需要觀察的屬性的set方法弟断,并且添加了willChangeValueForKey和didChangeValueForKey:的方法咏花,從而達(dá)到監(jiān)聽的目的,KVO的基礎(chǔ)是KVC阀趴,僅針對通過調(diào)用set方法賦值的情況下才能監(jiān)聽到昏翰,如果直接給屬性賦值,不走set方法的話是監(jiān)聽不到屬性的變化的

(3)isa指針的指向

isa 是一個指向?qū)ο笏鶎僬鎸嶎惖闹羔樍跫保瑢ο蟮膇sa指針指向類棚菊,類的isa指針指向元類,元類的isa指針指向根元類排霉,根元類的isa指針指向自己窍株,從而形成一個閉環(huán)

(4)屬性的實質(zhì)是什么? 包括哪幾個部分攻柠?屬性默認(rèn)的關(guān)鍵字都有哪些? @dynamic關(guān)鍵字和@synthesize關(guān)鍵字是用來做什么的后裸?

@property = ivar + getter + setter; 屬性 = 實例變量+getter+setter
屬性默認(rèn)的關(guān)鍵字:atomic和 readwrite瑰钮, assign
屬性可以擁有的特質(zhì)分為4類:
1 原子性 - atomic 和 nonatomic
2 讀/寫屬性 -- readwrite 和 readonly
3 內(nèi)存管理 -- strong weak assign copy retain unsafe_unretain
4 方法名 -- getter setter
@dynamic:不自動生成setter和getter方法,避免編譯期間的警告微驶,自己實現(xiàn)對應(yīng)的存取方法浪谴,或者在運行時動態(tài)綁定
@synthesize:自動合成getter和setter方法

(5)可變集合類和不可變集合類的copy和mutableCopy有什么區(qū)別?如果集合是內(nèi)容復(fù)制的話因苹,集合里面的元素也是內(nèi)容復(fù)制嗎苟耻?

copy復(fù)制的是一份不可變的對象,mutableCopy復(fù)制的是可變的對象
淺拷貝:僅拷貝對象的指針,就是多了一個指針指向該內(nèi)存區(qū)域
深拷貝:將該內(nèi)存區(qū)域里面所有的內(nèi)容都拷貝至新的內(nèi)存區(qū)域扶檐,并且有一個指針指向它
淺拷貝就是指針的拷貝凶杖,深拷貝就是內(nèi)容的拷貝
非集合類
對不可變對象進(jìn)行copy操作屬于指針拷貝,mutableCopy操作屬于內(nèi)容拷貝
對 可變對象 進(jìn)行 copy 和 mutableCopy 操作均屬于內(nèi)容拷貝
集合類
對不可變對象進(jìn)行的copy操作是指針拷貝款筑,mutableCopy操作屬于內(nèi)容拷貝
對 可變對象 copy和mutableCopy都是 內(nèi)容拷貝
集合類的內(nèi)容拷貝是拷貝集合類對象本身智蝠,里面的對象元素仍然屬于指針拷貝

(6)nonatomic和atomic的區(qū)別腾么?atomic是絕對的線程安全嗎?為什么杈湾?如果不是解虱,那應(yīng)該如何實現(xiàn)?

用來決定編譯器生成的getter和setter是否是原子操作的漆撞。
atomic會自動為getter個setter添加鎖殴泰,保證變量在多線程中的使用的時候是安全的
nonatomic禁止多線程,變量保護(hù)浮驳,提高性能艰匙。使用atomic是不一定線程安全的,atomic所說的線程安全只是保證了getter和setter存取方法的線程安全抹恳,并不能保證整個對象是線程安全的员凝,atomic使用的是同步鎖
解決方案是給當(dāng)前的對象互斥鎖

(7)UICollectionView開發(fā)界面有什么弊端?如何避免奋献?

這個我也不太清楚健霹,求大神解答

(8)進(jìn)程和線程的區(qū)別?同步和異步的區(qū)別瓶蚂?并行和并發(fā)的區(qū)別糖埋?

一個APP至少包含一個進(jìn)程,進(jìn)程中可以存在多個線程窃这,一個進(jìn)程一定有一個線程瞳别,多個線程共享進(jìn)程的所有資源。進(jìn)程有單獨的地址空間杭攻,線程是進(jìn)程中操作的不同執(zhí)行路徑祟敛,不存在單獨的地址空間,線程是CPU獨立運行和調(diào)度的基本單位兆解,進(jìn)程是資源分配的基本單位
同步:相當(dāng)于后一個的執(zhí)行依賴于前一個的執(zhí)行完成即為同步
異步:在執(zhí)行程序的過程中馆铁,可以去執(zhí)行別的任務(wù)稱為異步,任務(wù)互不等待
并發(fā):多個任務(wù)同時執(zhí)行成為并發(fā)锅睛,是物理意義上的并發(fā)
并行:也是多個任務(wù)一起執(zhí)行埠巨,但是是時間片上的輪轉(zhuǎn),看起來像是一起執(zhí)行
多線程是實現(xiàn)異步的一種手段现拒,開啟多個線程執(zhí)行異步任務(wù)

(9)線程間的通信辣垒?

GCD(異步進(jìn)入全局線程和異步回到主線程,在主線程中不要使用同步印蔬,會造成線程鎖)勋桶,NSThread(perform方法),NSOperation,最好再了解他們各自的優(yōu)缺點和差異性

(10)Designated Initializer(指定初始化函數(shù))?

提供“全能初始化方法”
具體細(xì)節(jié)可以通過搜索關(guān)鍵字了解

(11)block的實質(zhì)是什么哥遮? 一共有幾種block岂丘?都是在什么情況下生成的?

block本質(zhì)是使用了結(jié)構(gòu)體的C語言代碼眠饮,實質(zhì)上也是一個OC的對象
block一共存在三種形式:
棧上的block(出了函數(shù)的作用域之后就會銷毀)奥帘,沒有強(qiáng)指針引用的block都是棧區(qū)的block,作為函數(shù)的傳參的block在棧上
堆上的block(因為棧區(qū)的block會跟隨函數(shù)的作用域銷毀,但是有可能該block還是有用的仪召,所以要在堆上拷貝一份)寨蹋,有強(qiáng)指針引用或Copy修飾的成員變量會將棧區(qū)的block復(fù)制到堆區(qū),沒有強(qiáng)指針引用之后即可銷毀扔茅,生命周期由程序員控制
全局靜態(tài)的block --- 生命周期從創(chuàng)建到應(yīng)用程序結(jié)束

(12)為什么在默認(rèn)情況下無法修改被block捕獲的變量已旧? __block都做了什么?

block只會捕獲block中會用到的變量召娜。 由于只捕獲了自動變量(自動變量是以值傳遞方式傳遞到Block的構(gòu)造函數(shù)里面)的值运褪,并非內(nèi)存地址,所以Block內(nèi)部不能改變自動變量的值玖瘸。
變量的指針通常都是存放在棧上的秸讹,而__block會在堆上拷貝一份對應(yīng)的變量,并且引用變量的指針雅倒,從而達(dá)到修改的目的
如果指針本身就存在于堆上則直接修改原對象

(13)objc在向一個對象發(fā)送消息時璃诀,發(fā)生了什么?

runtime會根據(jù)對象的isa指針找到對象所屬的類蔑匣,然后在類中尋找是否有對象的方法和實現(xiàn)劣欢,如果當(dāng)前類中沒有的話,就會到父類中去找裁良,然后沿繼承鏈去尋找凿将,如果找到的話就直接運行,找不到的話就進(jìn)入消息轉(zhuǎn)發(fā)的流程

(14)什么時候會報unregnized selector錯誤趴久? iOS有哪些機(jī)制來避免走到這一步丸相?

當(dāng)對象及其父類沒有實現(xiàn)它所要調(diào)用的方法就會報錯,并且在運行時也沒有找到對應(yīng)的方法時彼棍,可以在消息轉(zhuǎn)發(fā)過程中的任何一個環(huán)節(jié)攔截這個錯誤并且處理,使應(yīng)用程序不會崩潰
這個主要說的就是消息轉(zhuǎn)發(fā)機(jī)制膳算,并且其中可采用的對應(yīng)的處理

(15)能否向編譯后得到的類中增加實例變量座硕?能否向運行時創(chuàng)建的類中添加實例變量?為什么涕蜂?

不能向編譯后得到的類中添加實例變量华匾,可以向運行時創(chuàng)建的類中添加實例變量,因為編譯后的類已經(jīng)注冊在 runtime 中,類結(jié)構(gòu)體中的 objc_ivar_list 實例變量的鏈表 和 instance_size 實例變量的內(nèi)存大小已經(jīng)確定,同時runtime 會調(diào)用 class_setIvarLayout 或 class_setWeakIvarLayout 來處理 strong weak 引用蜘拉。所以不能向存在的類中添加實例變量萨西;
運行時創(chuàng)建的類是可以添加實例變量,調(diào)用 class_addIvar 函數(shù)旭旭。但是得在調(diào)用 objc_allocateClassPair 之后谎脯,objc_registerClassPair 之前

(16)runtime如何實現(xiàn)weak變量的自動置為nil?

runtime 對注冊的類持寄, 會進(jìn)行布局源梭,對于 weak 對象會放入一個 hash 表中。 用 weak 指向的對象內(nèi)存地址作為 key稍味,當(dāng)此對象的引用計數(shù)為0的時候會 dealloc废麻,假如 weak 指向的對象內(nèi)存地址是a,那么就會以a為鍵模庐, 在這個 weak 表中搜索烛愧,找到所有以a為鍵的 weak 對象,從而設(shè)置為 nil掂碱。

(17)給類添加一個屬性后怜姿,在類結(jié)構(gòu)體理哪些元素會發(fā)生變化?

I_VAR
METHOD_LIST
屬性偏移量顶吮,
propert_list

(18)蘋果是如何實現(xiàn)autorelease pool的社牲?

autoreleasepool 以一個隊列數(shù)組的形式實現(xiàn),主要通過下列三個函數(shù)完成.

  1. objc_autoreleasepoolPush
  2. objc_autoreleasepoolPop
  3. objc_autorelease
    看函數(shù)名就可以知道,對 autorelease 分別執(zhí)行 push悴了,和 pop 操作搏恤。銷毀對象時執(zhí)行release操作。

(19)類方法和實例方法有什么區(qū)別湃交?

1 類方法在程序開始時就分配好了內(nèi)存熟空,實例方法在運行時分配內(nèi)存,所以類方法可以直接調(diào)用
2 實例方法需要通過實例來進(jìn)行調(diào)用搞莺,類方法可以直接調(diào)用(理論上比實例方法快)
3 類方法的內(nèi)存是連續(xù)的息罗,實例方法的內(nèi)存是分散的。類方法常駐內(nèi)存才沧,實例方法不是迈喉。
4 類方法在堆上分配內(nèi)存,實例方法在堆棧上
5 類方法中不能直接使用實例變量或調(diào)用實例方法

(20) 分類的內(nèi)部實現(xiàn)温圆?

1.我們不主動引入 Category 的頭文件挨摸,Category 中的方法都會被添加進(jìn)主類中。我們可以通過 - performSelector: 等方式 對 Category 中的相應(yīng)方法進(jìn)行調(diào)用
a)將 Category 和它的主類(或元類)注冊到哈希表中岁歉;
b)如果主類(或元類)已實現(xiàn)得运,那么重建它的方法列表
2.在這里分了兩種情況進(jìn)行處理:Category 中的實例方法和屬性被整合到主類中;而類方法則被整合到元類中。另外熔掺,對協(xié)議的處理比較特殊饱搏,Category 中的協(xié)議被同時整合到了主類和元類中。
3.注意到置逻,不管是哪種情況推沸,最終都是通過調(diào)用 staticvoid remethodizeClass(Class cls) 函數(shù)來重新整理類的數(shù)據(jù)的。

(21)objc向一個nil對象發(fā)送消息將會發(fā)生什么诽偷?

如果向一個nil對象發(fā)送消息的話坤学,會先去查詢對象的isa指針?biāo)赶虻念悾驗楫?dāng)前對象為nil报慕,isa指針的地址就是0直接返回了深浮,所以不會存在錯誤

(22)AFN為什么添加一條常駐線程?

AFN 的做法是把網(wǎng)絡(luò)請求的發(fā)起和解析都放在同一個子線程中進(jìn)行眠冈,但由于子線程默認(rèn)不開啟 runloop飞苇,它會向一個 C語言程序那樣在運行完所有代碼后退出線程。而網(wǎng)絡(luò)請求是異步的蜗顽,這會導(dǎo)致獲取到請求數(shù)據(jù)時布卡,線程已經(jīng)退出,代理方法沒有機(jī)會執(zhí)行雇盖。因此忿等,AFN 的做法是使用一個 runloop 來保證線程不死~
然而頻繁的創(chuàng)建線程并啟動runloop肯定會造成內(nèi)存泄露(runloop 無法停止.線程無法退出)
所以AFN就創(chuàng)建了一個單例線程,并且保證線程不退出~

(23)最近遇到的一個難點和解決的途徑?

(24)UIWebview有哪些性能問題崔挖?有沒有可替代的方案贸街?

我只能回答打開速度慢,而且交互不流暢狸相,求大神解答

(25)Swift和Objective-c語言的區(qū)別是什么薛匪?

當(dāng)你使用Swift編程的時候,你就不能使用Objective-C的思路去使用Swift了脓鹃,你要知道Swift的特性是什么逸尖,不單單是針對OC的特性,而是這門語言本身的特性

(26)http如何在客戶端實現(xiàn)轉(zhuǎn)變成HTTPS

這個詢問的是要用iOS原生的方法瘸右,這個問題目前我還沒有去看娇跟,所以沒有答案

(27)tanleview的優(yōu)化

一定要說得多一點,結(jié)合實例太颤,我這塊也是比較薄弱逞频,所以也沒有答案

(28)如何通過圖片的URL地址得出圖片的大小,如果圖片過大就不進(jìn)行下載栋齿?

這塊看得也簡單,最終都是要先去下載圖片的,不知道面試官的意思是是否圖片過大就不去解碼了瓦堵,這個部分也沒有吃透

(29)簡單算法了解

冒泡排序基协,快速排序,這些看還是要看看的菇用,至少問起來不尷尬

以上就是我整理和面試過程中沒有回答好的問題啦澜驮,希望對各位要面試或準(zhǔn)備面試的小伙伴有一點幫助。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惋鸥,一起剝皮案震驚了整個濱河市杂穷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卦绣,老刑警劉巖耐量,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滤港,居然都是意外死亡廊蜒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門溅漾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來山叮,“玉大人,你說我怎么就攤上這事添履∑ň螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵暮胧,是天一觀的道長锐借。 經(jīng)常有香客問我,道長叔壤,這世上最難降的妖魔是什么瞎饲? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮炼绘,結(jié)果婚禮上嗅战,老公的妹妹穿的比我還像新娘。我一直安慰自己俺亮,他們只是感情好驮捍,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脚曾,像睡著了一般东且。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上本讥,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天珊泳,我揣著相機(jī)與錄音鲁冯,去河邊找鬼。 笑死色查,一個胖子當(dāng)著我的面吹牛薯演,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秧了,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼跨扮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了验毡?” 一聲冷哼從身側(cè)響起衡创,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晶通,沒想到半個月后璃氢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡录择,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年拔莱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘竭。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡塘秦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出动看,到底是詐尸還是另有隱情尊剔,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布菱皆,位于F島的核電站须误,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仇轻。R本人自食惡果不足惜京痢,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篷店。 院中可真熱鬧祭椰,春花似錦、人聲如沸疲陕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹄殃。三九已至携茂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诅岩,已是汗流浹背讳苦。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工带膜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人医吊。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓钱慢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卿堂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容