iOS面試題總結(jié)

1.日常開(kāi)發(fā)中造成程序崩潰有哪些?如何避免、解決?
答:服務(wù)器返回的數(shù)據(jù)格式原因。導(dǎo)致崩潰,進(jìn)行容錯(cuò)處理,進(jìn)行相應(yīng)判斷再處理數(shù)據(jù)。例如:創(chuàng)建字典的時(shí)候value為nil。
數(shù)組越界問(wèn)題。采用runtime替換成自己的方法、

2.runloop和線程有什么關(guān)系?
答:主線程的run loop默認(rèn)是啟動(dòng)的, 子線程的runloop默認(rèn)是不開(kāi)啟的,需要我們自己手動(dòng)開(kāi)啟循環(huán),,runloop執(zhí)行完畢之后,就會(huì)進(jìn)入休眠 , 只有在某個(gè)情況下觸發(fā)了,才會(huì)再次調(diào)用。

3.使用系統(tǒng)的block api,是否也考慮引用循環(huán)問(wèn)題?
答:系統(tǒng)的某些block api中,UIView的block版本寫動(dòng)畫時(shí)不需要考慮。在ARC環(huán)境下,使用__weak關(guān)鍵字,可以避免循環(huán)引用

4.異常檢測(cè)的機(jī)制是什么?如何實(shí)現(xiàn)?
答:NSException

5.socket連接
答:Socket是對(duì)TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API),通過(guò)Socket,我們才能使用TCP/IP協(xié)議。建立網(wǎng)絡(luò)通信連接至少要一對(duì)端口號(hào)(socket)。進(jìn)程通信之前,雙方首先必須各自創(chuàng)建一個(gè)端點(diǎn),否則是沒(méi)有辦法建立聯(lián)系并相互通信的。

20161129011241557.png

手機(jī)能夠使用聯(lián)網(wǎng)功能是因?yàn)槭謾C(jī)底層實(shí)現(xiàn)了TCP/IP協(xié)議,可以使手機(jī)終端通過(guò)無(wú)線網(wǎng)絡(luò)建立TCP連接。TCP協(xié)議可以對(duì)上層網(wǎng)絡(luò)提供接口,使上層網(wǎng)絡(luò)數(shù)據(jù)的傳輸建立在“無(wú)差別”的網(wǎng)絡(luò)之上。建立起一個(gè)TCP連接需要經(jīng)過(guò)“三次握手”:
第一次握手:客戶端發(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=k),即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),完成三次握手。
握手過(guò)程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開(kāi)始傳送數(shù)據(jù)。

HTTP協(xié)議即超文本傳送協(xié)議(HypertextTransfer Protocol ),是Web聯(lián)網(wǎng)的基礎(chǔ),也是手機(jī)聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用。
HTTP連接最顯著的特點(diǎn)是客戶端發(fā)送的每次請(qǐng)求都需要服務(wù)器回送響應(yīng),在請(qǐng)求結(jié)束后,會(huì)主動(dòng)釋放連接。從建立連接到關(guān)閉連接的過(guò)程稱為“一次連接”。
1)在HTTP 1.0中,客戶端的每次請(qǐng)求都要求建立一次單獨(dú)的連接,在處理完本次請(qǐng)求后,就自動(dòng)釋放連接。
2)在HTTP 1.1中則可以在一次連接中處理多個(gè)請(qǐng)求,并且多個(gè)請(qǐng)求可以重疊進(jìn)行,不需要等待一個(gè)請(qǐng)求結(jié)束后再發(fā)送下一個(gè)請(qǐng)求。

6.描述應(yīng)用程序的啟動(dòng)順序
答:①.先加載Main函數(shù)

②.在Main函數(shù)里的 UIApplicationMain方法中,創(chuàng)建Application對(duì)象 創(chuàng)建Application的Delegate對(duì)象

③.創(chuàng)建主循環(huán),代理對(duì)象開(kāi)始監(jiān)聽(tīng)事件

④.啟動(dòng)完畢會(huì)調(diào)用 didFinishLaunching方法,并在這個(gè)方法中創(chuàng)建UIWindow

⑤.設(shè)置UIWindow的根控制器是誰(shuí)

⑥.如果有storyboard,會(huì)根據(jù)info.plist中找到應(yīng)用程序的入口storyboard并加載箭頭所指的控制器

⑦.顯示窗口

技術(shù)
基礎(chǔ)

1. 為什么說(shuō)Objective-C是一門動(dòng)態(tài)的語(yǔ)言?
答:oc的多態(tài)性讓其擁有動(dòng)態(tài)性,objective-c的動(dòng)態(tài)性,讓程序在運(yùn)行時(shí)判斷其該有的行為。它的動(dòng)態(tài)性主要體現(xiàn)在3個(gè)方面:
1.動(dòng)態(tài)類型:如id類型。實(shí)際上靜態(tài)類型因?yàn)槠?br> 固定性和可預(yù)知性而使用的特別廣泛。靜態(tài)類型是強(qiáng)類型,動(dòng)態(tài)類型是弱類型,運(yùn)行時(shí)決定接收者。
2.動(dòng)態(tài)綁定:讓代碼在運(yùn)行時(shí)判斷需要
調(diào)用什么方法,而不是在編譯時(shí)。與其他面向?qū)ο笳Z(yǔ)言一樣,方法調(diào)用和代碼并沒(méi)有在編譯時(shí)連接在一起,而是在消息發(fā)送時(shí)才進(jìn)行連接。運(yùn)行時(shí)決定調(diào)用哪個(gè)方法。
3.動(dòng)態(tài)載入。讓程序在運(yùn)行時(shí)添加代碼模塊以及其他資源。用戶可以根據(jù)需要執(zhí)行一些可執(zhí)行代碼和資源,而不是在啟動(dòng)時(shí)就加載所有
組件。可執(zhí)行代碼中可以含有和程序運(yùn)行時(shí)整合的新類。

2.講一下MVC和MVVM,MVP?
答:MVC(模型-視圖-控制器),M是指業(yè)務(wù)數(shù)據(jù), V是指用戶界面, C則是控制器. 在具體的業(yè)務(wù)場(chǎng)景中, C作為M和V之間的連接, 負(fù)責(zé)獲取輸入的業(yè)務(wù)數(shù)據(jù), 然后將處理后的數(shù)據(jù)輸出到界面上做相應(yīng)展示, 另外, 在數(shù)據(jù)有所更新時(shí), C還需要及時(shí)提交相應(yīng)更新到界面展示,因?yàn)镸和V之間是完全隔離的, 所以在業(yè)務(wù)場(chǎng)景切換時(shí), 通常只需要替換相應(yīng)的C, 復(fù)用已有的M和V便可快速搭建新的業(yè)務(wù)場(chǎng)景. MVC因其復(fù)用性, 大大提高了開(kāi)發(fā)效率,但隨著業(yè)務(wù)數(shù)據(jù)的復(fù)雜,大量的代碼被放進(jìn)viewcontroller,導(dǎo)致很難測(cè)試。

MVVM: 模型-視圖-視圖模型(Model-View-ViewModel),view和view controller正式聯(lián)系在一起,我們把它們視為一個(gè)組件。視圖view仍然不能直接引用模型Model,當(dāng)然controller也不能。相反,他們引用視圖模型view Model。view Model是一個(gè)放置用戶輸入驗(yàn)證邏輯,視圖顯示邏輯,發(fā)起網(wǎng)絡(luò)請(qǐng)求和其他各種各樣的代碼的極好的地方。

MVP:M : 邏輯Model層 V : 視圖層 P : protocol協(xié)議層,它將業(yè)務(wù)邏輯和業(yè)務(wù)展示也做了一層隔離, 對(duì)應(yīng)的就變成了MVCP. M和V功能不變, 原來(lái)的C現(xiàn)在只負(fù)責(zé)布局, 而所有的邏輯全都轉(zhuǎn)移到了P層.

3.為什么代理要用weak?代理的delegate和dataSource有什么區(qū)別?block和代理的區(qū)別?
答:weak:指明該對(duì)象并不負(fù)責(zé)保持delegate這個(gè)對(duì)象,delegate這個(gè)對(duì)象的銷毀由外部控制
strong:該對(duì)象強(qiáng)引用delegate,外界不能銷毀delegate對(duì)象,會(huì)導(dǎo)致循環(huán)引用(Retain Cycles)
代理用weak為了防止循環(huán)引用

delegate控制的是UI,是上層的東西;而datasource控制的是數(shù)據(jù)。他們本質(zhì)都是回調(diào),只是回調(diào)的對(duì)象不同

block 更輕型,使用更簡(jiǎn)單,能夠直接訪問(wèn)上下文,這樣類中不需要存儲(chǔ)臨時(shí)數(shù)據(jù),使用 block 的代碼通常會(huì)在同一個(gè)地方,這樣讀代碼也連貫。delegate 更重一些,需要實(shí)現(xiàn)接口,它的方法分離開(kāi)來(lái),很多時(shí)候需要存儲(chǔ)一些臨時(shí)數(shù)據(jù),另外相關(guān)的代碼會(huì)被分離到各處,沒(méi)有 block 好讀。
如果這個(gè)回調(diào)是一個(gè)不定期觸發(fā),或者會(huì)多次觸發(fā)的,那么 Delegation 應(yīng)該更適合;如果這個(gè)回調(diào)是一個(gè)一次性的,并且和調(diào)用方法是單線性關(guān)系的,那么 Block 應(yīng)該更適合。

4.屬性的實(shí)質(zhì)是什么?包括哪幾個(gè)部分?屬性默認(rèn)的關(guān)鍵字都有哪些?@dynamic關(guān)鍵字和@synthesize關(guān)鍵字是用來(lái)做什么的?
答:

5.NSString為什么要用copy關(guān)鍵字,如果用strong會(huì)有什么問(wèn)題?(注意:這里沒(méi)有說(shuō)用strong就一定不行。使用copy和strong是看情況而定的)
6.如何令自己所寫的對(duì)象具有拷貝功能?
7.可變集合類 和 不可變集合類的 copy 和 mutablecopy有什么區(qū)別?如果是集合是內(nèi)容復(fù)制的話,集合里面的元素也是內(nèi)容復(fù)制么?
8.為什么IBOutlet修飾的UIView也適用weak關(guān)鍵字?
9.nonatomic和atomic的區(qū)別?atomic是絕對(duì)的線程安全么?為什么?如果不是,那應(yīng)該如何實(shí)現(xiàn)?
10.UICollectionView自定義layout如何實(shí)現(xiàn)?
11.用StoryBoard開(kāi)發(fā)界面有什么弊端?如何避免?
12.進(jìn)程和線程的區(qū)別?同步異步的區(qū)別?并行和并發(fā)的區(qū)別?
線程間通信?

答:一個(gè)程序至少包含一個(gè)進(jìn)程,一個(gè)進(jìn)程至少包含一個(gè)線程,一個(gè)進(jìn)程中的所有線程共享當(dāng)前進(jìn)程所擁有的資源。

任務(wù)的執(zhí)行分為同步和異步,同步執(zhí)行是發(fā)出一個(gè)調(diào)用時(shí),等待執(zhí)行完返回,才繼續(xù)往下執(zhí)行,異步執(zhí)行是發(fā)出調(diào)用之后立即返回,繼續(xù)往下執(zhí)行.(例子: 同步: 你打電話問(wèn)書店老板有沒(méi)有 <<多線程編程>> 這本書,如果是同步通信機(jī)制.書店老板會(huì)說(shuō),你稍等,”我查一下",然后開(kāi)始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結(jié)果(返回結(jié)果).這其中你電話不掛斷.(等待返回結(jié)果)接收不到返回結(jié)果,不繼續(xù)下面的操作. 異步:書店老板直接告訴你我查一下啊,查好了打電話給你,然后直接掛電話了(不返回結(jié)果).你繼續(xù)該干哈干哈.等老板然后查好了,他會(huì)主動(dòng)打電話給你,在這里老板通過(guò)“回電”這種方式來(lái)回調(diào).

并行:三個(gè)人同時(shí)吃一個(gè)饅頭(指兩個(gè)或兩個(gè)以上事件或活動(dòng)在同一時(shí)刻發(fā)生。在多道程序環(huán)境下,并行性使多個(gè)程序同一時(shí)刻可在不同CPU上同時(shí)執(zhí)行。)
并發(fā):一個(gè)人同時(shí)吃三個(gè)饅頭(指兩個(gè)或兩個(gè)以上的事件或活動(dòng)在同一時(shí)間間隔內(nèi)發(fā)生。并發(fā)的實(shí)質(zhì)是一個(gè)物理CPU(也可以多個(gè)物理CPU) 在若干道程序之間多路復(fù)用,并發(fā)性是
對(duì)有限物理資源強(qiáng)制行使多用戶共享以提高效率。)

13.GCD的一些常用的函數(shù)?(group,barrier,信號(hào)量,線程同步)
14.如何使用隊(duì)列來(lái)避免資源搶奪?
15.數(shù)據(jù)持久化的幾個(gè)方案(fmdb用沒(méi)用過(guò))
答:plist文件(屬性列表)
preference(偏好設(shè)置)
NSKeyedArchiver(歸檔)
SQLite 3(FMDB)
CoreData

16.說(shuō)一下AppDelegate的幾個(gè)方法?從后臺(tái)到前臺(tái)調(diào)用了哪些方法?第一次啟動(dòng)調(diào)用了哪些方法?從前臺(tái)到后臺(tái)調(diào)用了哪些方法?
答: //當(dāng)程序第一次運(yùn)行并且將要顯示窗口的時(shí)候執(zhí)行,在該方法中我們完成的操作(1)創(chuàng)建一個(gè)窗口對(duì)象,并且將窗口對(duì)象指定為程序的主窗口。(2)我們寫的代碼也在該方法中。

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible]; //指定為主窗口
    return YES;
    }

//程序進(jìn)入后臺(tái)的時(shí)候首先執(zhí)行程序?qū)⒁∠钴S該方法。

  • (void)applicationWillResignActive:(UIApplication *)application {
    //在該方法中我們經(jīng)常用來(lái)暫停正在執(zhí)行的任務(wù),讓時(shí)間計(jì)時(shí)器失效。如果是游戲需要暫停游戲的運(yùn)行。
    }
    //該方法當(dāng)應(yīng)用程序進(jìn)入后臺(tái)的時(shí)候調(diào)用
  • (void)applicationDidEnterBackground:(UIApplication *)application {
    //在該方法中經(jīng)常用來(lái)釋放一些公共資源,保存用戶數(shù)據(jù),使時(shí)間計(jì)時(shí)器失效,保存足夠的狀態(tài)信息用來(lái)恢復(fù)應(yīng)用程序之前的狀態(tài)。
    //當(dāng)應(yīng)用程序支持后臺(tái)運(yùn)行的時(shí)候,該方法會(huì)取代applicationWillTerminate:方法
    }

//當(dāng)程序進(jìn)入將要前臺(tái)的時(shí)候調(diào)用

  • (void)applicationWillEnterForeground:(UIApplication *)application {
    //該方法中我們經(jīng)常用來(lái)取消在程序進(jìn)入后臺(tái)的時(shí)候執(zhí)行的操作。
    }
    //應(yīng)用程序已經(jīng)變得活躍(應(yīng)用程序的運(yùn)行狀態(tài))
  • (void)applicationDidBecomeActive:(UIApplication *)application {
    //重啟之前暫?;蛘咧案緵](méi)有運(yùn)行的任務(wù)。如果程序之前在后臺(tái),必要的時(shí)候需要做界面的刷新操作。
    }

//當(dāng)程序?qū)⒁顺龅臅r(shí)候調(diào)用,如果應(yīng)用程序支持后臺(tái)運(yùn)行,該方法被applicationDidEnterBackground:替換

  • (void)applicationWillTerminate:(UIApplication *)application {
    }

17.NSCache優(yōu)于NSDictionary的幾點(diǎn)?
答:NSCache勝過(guò)NSDictionary之處在于,當(dāng)系統(tǒng)資源將要耗盡時(shí),它可以自動(dòng)刪減緩存。如果采用普通的字典,那么就要自己編寫掛鉤,在系統(tǒng)發(fā)出“低內(nèi)存”通知時(shí)手工刪減緩存。

NSCache并不會(huì)“拷貝”鍵,而是會(huì)“保留”它。此行為用NSDictionary也可以實(shí)現(xiàn),然而需要編寫相當(dāng)復(fù)雜的代碼。NSCache對(duì)象不拷貝鍵的原因在于:很多時(shí)候,鍵都是不支持拷貝操作的對(duì)象來(lái)充當(dāng)?shù)?。因此,NSCache不會(huì)自動(dòng)拷貝鍵,所以說(shuō),在鍵不支持拷貝操作的情況下,該類用起來(lái)比字典更方便。另外,NSCache是線程安全的,而NSDictionary則絕對(duì)不具備此優(yōu)勢(shì)。

18.知不知道Designated Initializer?使用它的時(shí)候有什么需要注意的問(wèn)題?
答:是一個(gè)很有用的宏,充分發(fā)揮編譯器的特性幫我們找出初始化過(guò)程中可能存在的漏洞,增強(qiáng)代碼的健壯性。
(1)每個(gè)類的正確初始化過(guò)程應(yīng)當(dāng)是按照從子類到父類的順序,依次調(diào)用每個(gè)類的Designated Initializer。并且用父類的Designated Initializer初始化一個(gè)子類對(duì)象,也需要遵從這個(gè)過(guò)程。
(2)如果子類指定了新的初始化器,那么在這個(gè)初始化器內(nèi)部必須調(diào)用父類的Designated Initializer。并且需要重寫父類的Designated Initializer,將其指向子類新的初始化器。
(3)你可以不自定義Designated Initializer,也可以重寫父類的Designated Initializer,但需要調(diào)用直接父類的Designated Initializer。
(4)如果有多個(gè)Secondary initializers(次要初始化器),它們之間可以任意調(diào)用,但最后必須指向Designated Initializer。在Secondary initializers內(nèi)不能直接調(diào)用父類的初始化器。
(5)如果有多個(gè)不同數(shù)據(jù)源的Designated Initializer,那么不同數(shù)據(jù)源下的Designated Initializer應(yīng)該調(diào)用相應(yīng)的[super (designated initializer)]。如果父類沒(méi)有實(shí)現(xiàn)相應(yīng)的方法,則需要根據(jù)實(shí)際情況來(lái)決定是給父類補(bǔ)充一個(gè)新的方法還是調(diào)用父類其他數(shù)據(jù)源的Designated Initializer。比如UIView的initWithCoder調(diào)用的是NSObject的init。
(6)需要注意不同數(shù)據(jù)源下添加額外初始化動(dòng)作的時(shí)機(jī)。
詳解:http://blog.jobbole.com/65762/

19.實(shí)現(xiàn)description方法能取到什么效果?
答:使用NSLog 和 %@ 輸出某個(gè)對(duì)象時(shí),就會(huì)調(diào)用這個(gè)對(duì)象的 description 方法,它的返回值就是 NSString 字符串類型

20.objc使用什么機(jī)制管理對(duì)象內(nèi)存?
答:1).MRC(manual retain-release)手動(dòng)內(nèi)存管理2).ARC(automatic reference counting)自動(dòng)引用計(jì)數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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