又是一年應(yīng)聘季沪蓬。今天給大家整理了iOS面試的幾個(gè)知識(shí)點(diǎn)。希望大家都拿到自己期望的薪資来候!
更多面試資料
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)的面試資料铐料。如果你有什么意見和建議歡迎給我留言渐裂。下篇文章再見!
更多面試資料
---原文地址