iOS面試知識(shí)點(diǎn)-今日份整理

又是一年應(yīng)聘季沪蓬。今天給大家整理了iOS面試的幾個(gè)知識(shí)點(diǎn)。希望大家都拿到自己期望的薪資来候!

一起加油u尾妗!营搅!

更多面試資料

1.iOS 類(class)和結(jié)構(gòu)體(struct)有什么區(qū)別云挟?


class Temperature {
  var value: Float = 37.0
}

class Person {
  var temp: Temperature?

  func sick() {
    temp?.value = 41.0
  }
}

let A = Person()
let B = Person()
let temp = Temperature()

A.temp = temp
B.temp = temp

A.sick() 上面這段代碼,由于 Temperature 是 class 转质,為引用類型园欣,故 A 的 temp 和 B 的 temp指向同一個(gè)對(duì)象。A 的 temp修改了休蟹,B 的 temp 也隨之修改沸枯。這樣 A 和 B 的 temp 的值都被改成了41.0。如果將 Temperature 改為 struct鸡挠,為值類型辉饱,則 A 的 temp 修改不影響 B 的 temp。

內(nèi)存中拣展,引用類型諸如類是在堆(heap)上彭沼,而值類型諸如結(jié)構(gòu)體實(shí)在棧(stack)上進(jìn)行存儲(chǔ)和操作。相比于棧上的操作备埃,堆上的操作更加復(fù)雜耗時(shí)姓惑,所以蘋果官方推薦使用結(jié)構(gòu)體褐奴,這樣可以提高 App 運(yùn)行的效率。

class有這幾個(gè)功能struct沒有的:

class可以繼承于毙,這樣子類可以使用父類的特性和方法 類型轉(zhuǎn)換可以在runtime的時(shí)候檢查和解釋一個(gè)實(shí)例的類型 可以用deinit來釋放資源 一個(gè)類可以被多次引用 struct也有這樣幾個(gè)優(yōu)勢(shì):

結(jié)構(gòu)較小敦冬,適用于復(fù)制操作,相比于一個(gè)class的實(shí)例被多次引用更加安全唯沮。 無須擔(dān)心內(nèi)存memory leak或者多線程沖突問題脖旱。

2.什么是GCD ?談?wù)勀銓?duì)GCD的理解介蛉?

GCD是Grand Central Dispatch的縮寫萌庆。

Grand Central Dispatch (GCD)是Apple開發(fā)的一個(gè)多核編程的較新的解決方法。在Mac OS X 10.6雪豹中首次推出币旧,并在最近引入到了iOS4.0践险。

GCD是一個(gè)替代諸如NSThread等技術(shù)的很高效和強(qiáng)大的技術(shù)。GCD完全可以處理諸如數(shù)據(jù)鎖定和資源泄漏等復(fù)雜的異步編程問題吹菱。

GCD可以完成很多事情巍虫,但是這里僅關(guān)注在iOS應(yīng)用中實(shí)現(xiàn)多線程所需的一些基礎(chǔ)知識(shí)。

在開始之前鳍刷,需要理解是要提供給GCD隊(duì)列的是代碼塊占遥,用于在系統(tǒng)或者用戶創(chuàng)建的的隊(duì)列上調(diào)度運(yùn)行。 聲明一個(gè)隊(duì)列

如下會(huì)返回一個(gè)用戶創(chuàng)建的隊(duì)列:

dispatch_queue_t myQueue =  dispatch_queue_create("com.iphonedevblog.post",  NULL);

其中倾剿,第一個(gè)參數(shù)是標(biāo)識(shí)隊(duì)列的筷频,第二個(gè)參數(shù)是用來定義隊(duì)列的參數(shù)(目前不支持,因此傳入NULL)前痘。

執(zhí)行一個(gè)隊(duì)列
如下會(huì)異步執(zhí)行傳入的代碼:

dispatch_async(myQueue, ^{ [self doSomething]; });其中凛捏,首先傳入之前創(chuàng)建的隊(duì)列,然后提供由隊(duì)列運(yùn)行的代碼塊芹缔。

聲明并執(zhí)行一個(gè)隊(duì)列
如果不需要保留要運(yùn)行的隊(duì)列的引用坯癣,可以通過如下代碼實(shí)現(xiàn)之前的功能:  dispatch_async(dispatch_queue_create ("com.iphonedevblog.post", NULL), ^{ [self doSomething]; });如果需要暫停一個(gè)隊(duì)列,可以調(diào)用如下代碼最欠。暫停一個(gè)隊(duì)列會(huì)阻止和該隊(duì)列相關(guān)的所有代碼運(yùn)行示罗。  dispatch_suspend(myQueue);

暫停一個(gè)隊(duì)列
如果暫停一個(gè)隊(duì)列不要忘記恢復(fù)芝硬。暫停和恢復(fù)的操作和內(nèi)存管理中的retain和release類似蚜点。調(diào)用dispatch_suspend會(huì)增加暫停計(jì)數(shù),而dispatch_resume則會(huì)減少拌阴。隊(duì)列只有在暫停計(jì)數(shù)變成零的情況下才開始運(yùn)行绍绘。dispatch_resume(myQueue);

恢復(fù)一個(gè)隊(duì)列 從隊(duì)列中在主線程運(yùn)行代碼
有些操作無法在異步隊(duì)列運(yùn)行,因此必須在主線程(每個(gè)應(yīng)用都有一個(gè))上運(yùn)行。UI繪圖以及任何對(duì)NSNotificationCenter的調(diào)用必須在主線程長(zhǎng)進(jìn)行陪拘。在另一個(gè)隊(duì)列中訪問主線程并運(yùn)行代碼的示例如下:  dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });注意厂镇,dispatch_suspend(以及dispatch_resume)在主線程上不起作用。

使用GCD左刽,可以讓你的程序不會(huì)失去響應(yīng). 多線程不容易使用捺信,用了GCD,會(huì)讓它變得簡(jiǎn)單欠痴。你無需專門進(jìn)行線程管理, 很棒迄靠!

  dispatch_queue_t   t1=dispatch_queue_create("1"  ,NULL); 
  dispatch_queue_t   t2=dispatch_queue_create("2",NULL); 
  dispatch_async(t1, ^{ 
      [self print1]; 
    }); 
  dispatch_async(t2, ^{ 
      [self print2]; 
    }); 

3.iOS自動(dòng)釋放池是什么,如何工作 ?

當(dāng)您向一個(gè)對(duì)象發(fā)送一個(gè)autorelease消息時(shí)喇辽,Cocoa就會(huì)將該對(duì)象的一個(gè)引用放入到最新的自動(dòng)釋放池梨水。它仍然是個(gè)正當(dāng)?shù)膶?duì)象,因此自動(dòng)釋放池定義的作用域內(nèi)的其它對(duì)象可以向它發(fā)送消息茵臭。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí),自動(dòng)釋放池就會(huì)被釋放舅世,池中的所有對(duì)象也就被釋放旦委。

1、object-c 是通過一種"referring counting"(引用計(jì)數(shù))的方式來管理內(nèi)存的, 對(duì)象在開始分配內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會(huì)加一, 每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會(huì)減一,如果此對(duì)象的計(jì)數(shù)變?yōu)榱?, 就會(huì)被系統(tǒng)銷毀.

2雏亚、NSAutoreleasePool 就是用來做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的.

3缨硝、autorelease和release沒什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會(huì)在對(duì)象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一.

4.iOS一個(gè)tableView是否可以關(guān)聯(lián)兩個(gè)不同的數(shù)據(jù)源?你會(huì)怎么處理罢低?

答案:首先我們從代碼來看查辩,數(shù)據(jù)源如何關(guān)聯(lián)上的,其實(shí)是在數(shù)據(jù)源關(guān)聯(lián)的*方法里實(shí)現(xiàn)的网持。 因此我們并不關(guān)心如何去關(guān)聯(lián)他宜岛,他怎么關(guān)聯(lián)上,方法只是讓我返回根據(jù)自己的需要去設(shè)置如相關(guān)的數(shù)據(jù)源功舀。 因此萍倡,我覺得可以設(shè)置多個(gè)數(shù)據(jù)源啊,但是有個(gè)問題是辟汰,你這是想干嘛呢列敲?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示帖汞?

5.iOS類別的作用戴而?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?

答案:
category 可以在不獲悉翩蘸,不改變?cè)瓉泶a的情況下往里面添加新的方法所意,只能添加,不能刪除修改。 并且如果類別和原來類中的方法產(chǎn)生名稱沖突扁眯,則類別將覆蓋原來的方法壮莹,因?yàn)轭悇e具有更高的優(yōu)先級(jí)。
類別主要有3個(gè)作用:

(1)將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中姻檀。

(2)創(chuàng)建對(duì)私有方法的前向引用命满。

(3)向?qū)ο筇砑臃钦絽f(xié)議。 繼承可以增加绣版,修改或者刪除方法胶台,并且可以增加屬性。

6.從輸入url到頁面展示到底發(fā)生了什么

1杂抽、輸入地址
2诈唬、瀏覽器查找域名的 IP 地址  
3、瀏覽器向 web 服務(wù)器發(fā)送一個(gè) HTTP 請(qǐng)求
4缩麸、服務(wù)器的永久重定向響應(yīng)
5铸磅、瀏覽器跟蹤重定向地址
6、服務(wù)器處理請(qǐng)求
7杭朱、服務(wù)器返回一個(gè) HTTP 響應(yīng) 
8阅仔、瀏覽器顯示 HTML
9、瀏覽器發(fā)送請(qǐng)求獲取嵌入在 HTML 中的資源(如圖片弧械、音頻八酒、視頻、CSS刃唐、JS等等)

7.iOS中持久化方式有哪些羞迷?

屬性列表文件 -- NSUserDefaults 的存儲(chǔ),實(shí)際是本地生成一個(gè) plist 文件画饥,將所需屬性存儲(chǔ)在 plist 文件中

對(duì)象歸檔 -- 本地創(chuàng)建文件并寫入數(shù)據(jù)衔瓮,文件類型不限

SQLite 數(shù)據(jù)庫 -- 本地創(chuàng)建數(shù)據(jù)庫文件,進(jìn)行數(shù)據(jù)處理

CoreData -- 同數(shù)據(jù)庫處理思想相同抖甘,但實(shí)現(xiàn)方式不同

8.你在開發(fā)過程中常用到哪些定時(shí)器报辱,定時(shí)器時(shí)間會(huì)有誤差嗎,如果有单山,為什么會(huì)有誤差碍现?

iOS中常NSTimer、CADisplayLink米奸、GCD定時(shí)器昼接,其中NSTimer、CADisplayLink基于NSRunLoop實(shí)現(xiàn)悴晰,故存在誤差慢睡,GCD定時(shí)器只依賴系統(tǒng)內(nèi)核逐工,相對(duì)一前兩者是比較準(zhǔn)時(shí)的。

誤差原因是:與NSRunLoop機(jī)制有關(guān)漂辐, 因?yàn)镽unLoop每跑完一次圈再去檢查當(dāng)前累計(jì)時(shí)間是否已經(jīng)達(dá)到定時(shí)設(shè)置的間隔時(shí)間泪喊,如果未達(dá)到,RunLoop將進(jìn)入下一輪任務(wù)髓涯,待任務(wù)結(jié)束之后再去檢查當(dāng)前累計(jì)時(shí)間袒啼,而此時(shí)的累計(jì)時(shí)間可能已經(jīng)超過了定時(shí)器的間隔時(shí)間,故會(huì)存在誤差纬纪。

9.怎樣防止指針的越界使用問題?

必須讓指針指向一個(gè)有效的內(nèi)存地址,

1蚓再、防止數(shù)組越界
2、防止向一塊內(nèi)存中拷貝過多的內(nèi)容
3包各、防止使用空指針
4摘仅、防止改變const修改的指針
5、防止改變指向靜態(tài)存儲(chǔ)區(qū)的內(nèi)容
6问畅、防止兩次釋放一個(gè)指針
7娃属、防止使用野指針.

10.iOS你在項(xiàng)目中用過 runtime 嗎?舉個(gè)例子

Objective-C 語言是一門動(dòng)態(tài)語言护姆,編譯器不需要關(guān)心接受消息的對(duì)象是何種類型膳犹,接收消息的對(duì)象問題也要在運(yùn)行時(shí)處理。

pragramming 層面的 runtime 主要體現(xiàn)在以下幾個(gè)方面:

關(guān)聯(lián)對(duì)象 Associated Objects
消息發(fā)送 Messaging
消息轉(zhuǎn)發(fā) Message Forwarding
方法調(diào)配 Method Swizzling
“類對(duì)象” NSProxy Foundation | Apple Developer Documentation
KVC签则、KVO About Key-Value Coding

總結(jié)

本篇文章到這里就結(jié)束了。下篇文章將繼續(xù)為大家?guī)砥渌R(shí)點(diǎn)的面試資料铐料。如果你有什么意見和建議歡迎給我留言渐裂。下篇文章再見!

更多面試資料

---原文地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钠惩,一起剝皮案震驚了整個(gè)濱河市柒凉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篓跛,老刑警劉巖膝捞,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異愧沟,居然都是意外死亡蔬咬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門沐寺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來林艘,“玉大人,你說我怎么就攤上這事混坞『” “怎么了钢坦?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)啥酱。 經(jīng)常有香客問我爹凹,道長(zhǎng),這世上最難降的妖魔是什么镶殷? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任禾酱,我火速辦了婚禮,結(jié)果婚禮上批钠,老公的妹妹穿的比我還像新娘宇植。我一直安慰自己,他們只是感情好埋心,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布指郁。 她就那樣靜靜地躺著,像睡著了一般拷呆。 火紅的嫁衣襯著肌膚如雪闲坎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天茬斧,我揣著相機(jī)與錄音腰懂,去河邊找鬼。 笑死项秉,一個(gè)胖子當(dāng)著我的面吹牛绣溜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娄蔼,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼怖喻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了岁诉?” 一聲冷哼從身側(cè)響起锚沸,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涕癣,沒想到半個(gè)月后哗蜈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坠韩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年距潘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片只搁。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绽昼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出须蜗,到底是詐尸還是另有隱情硅确,我是刑警寧澤目溉,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站菱农,受9級(jí)特大地震影響缭付,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜循未,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一陷猫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧的妖,春花似錦绣檬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至星虹,卻和暖如春零抬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宽涌。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工平夜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卸亮。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓忽妒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親兼贸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子段直,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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