1.日常開發(fā)中造成程序崩潰有哪些蕾羊?如何避免喧笔、解決?
答:服務(wù)器返回的數(shù)據(jù)格式原因龟再。導(dǎo)致崩潰书闸,進(jìn)行容錯處理,進(jìn)行相應(yīng)判斷再處理數(shù)據(jù)利凑。例如:創(chuàng)建字典的時候value為nil浆劲。
數(shù)組越界問題。采用runtime替換成自己的方法哀澈、
2.runloop和線程有什么關(guān)系牌借?
答:主線程的run loop默認(rèn)是啟動的, 子線程的runloop默認(rèn)是不開啟的,需要我們自己手動開啟循環(huán),,runloop執(zhí)行完畢之后,就會進(jìn)入休眠 , 只有在某個情況下觸發(fā)了,才會再次調(diào)用割按。
3.使用系統(tǒng)的block api膨报,是否也考慮引用循環(huán)問題?
答:系統(tǒng)的某些block api中哲虾,UIView的block版本寫動畫時不需要考慮。在ARC環(huán)境下择示,使用__weak關(guān)鍵字束凑,可以避免循環(huán)引用
4.異常檢測的機(jī)制是什么?如何實現(xiàn)栅盲?
答:NSException
5.socket連接
答:Socket是對TCP/IP協(xié)議的封裝汪诉,Socket本身并不是協(xié)議,而是一個調(diào)用接口(API)谈秫,通過Socket扒寄,我們才能使用TCP/IP協(xié)議。建立網(wǎng)絡(luò)通信連接至少要一對端口號(socket)拟烫。進(jìn)程通信之前该编,雙方首先必須各自創(chuàng)建一個端點,否則是沒有辦法建立聯(lián)系并相互通信的硕淑。
手機(jī)能夠使用聯(lián)網(wǎng)功能是因為手機(jī)底層實現(xiàn)了TCP/IP協(xié)議课竣,可以使手機(jī)終端通過無線網(wǎng)絡(luò)建立TCP連接。TCP協(xié)議可以對上層網(wǎng)絡(luò)提供接口置媳,使上層網(wǎng)絡(luò)數(shù)據(jù)的傳輸建立在“無差別”的網(wǎng)絡(luò)之上于樟。建立起一個TCP連接需要經(jīng)過“三次握手”:
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài)拇囊,等待服務(wù)器確認(rèn)迂曲;
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1)寥袭,同時自己也發(fā)送一個SYN包(syn=k)路捧,即SYN+ACK包关霸,此時服務(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)涉波,完成三次握手英上。
握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后啤覆,客戶端與服務(wù)器才正式開始傳送數(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連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng)笨觅,在請求結(jié)束后拦耐,會主動釋放連接。從建立連接到關(guān)閉連接的過程稱為“一次連接”见剩。
1)在HTTP 1.0中杀糯,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后苍苞,就自動釋放連接固翰。
2)在HTTP 1.1中則可以在一次連接中處理多個請求,并且多個請求可以重疊進(jìn)行羹呵,不需要等待一個請求結(jié)束后再發(fā)送下一個請求骂际。
6.描述應(yīng)用程序的啟動順序
答:①.先加載Main函數(shù)
②.在Main函數(shù)里的 UIApplicationMain方法中,創(chuàng)建Application對象 創(chuàng)建Application的Delegate對象
③.創(chuàng)建主循環(huán)冈欢,代理對象開始監(jiān)聽事件
④.啟動完畢會調(diào)用 didFinishLaunching方法歉铝,并在這個方法中創(chuàng)建UIWindow
⑤.設(shè)置UIWindow的根控制器是誰
⑥.如果有storyboard,會根據(jù)info.plist中找到應(yīng)用程序的入口storyboard并加載箭頭所指的控制器
⑦.顯示窗口
技術(shù)
基礎(chǔ)
1. 為什么說Objective-C是一門動態(tài)的語言?
答:oc的多態(tài)性讓其擁有動態(tài)性凑耻,objective-c的動態(tài)性犯戏,讓程序在運行時判斷其該有的行為。它的動態(tài)性主要體現(xiàn)在3個方面:
1.動態(tài)類型:如id類型拳话。實際上靜態(tài)類型因為其
固定性和可預(yù)知性而使用的特別廣泛先匪。靜態(tài)類型是強(qiáng)類型,動態(tài)類型是弱類型弃衍,運行時決定接收者呀非。
2.動態(tài)綁定:讓代碼在運行時判斷需要
調(diào)用什么方法,而不是在編譯時。與其他面向?qū)ο笳Z言一樣岸裙,方法調(diào)用和代碼并沒有在編譯時連接在一起猖败,而是在消息發(fā)送時才進(jìn)行連接。運行時決定調(diào)用哪個方法降允。
3.動態(tài)載入恩闻。讓程序在運行時添加代碼模塊以及其他資源。用戶可以根據(jù)需要執(zhí)行一些可執(zhí)行代碼和資源剧董,而不是在啟動時就加載所有
組件幢尚。可執(zhí)行代碼中可以含有和程序運行時整合的新類翅楼。
2.講一下MVC和MVVM尉剩,MVP?
答:MVC(模型-視圖-控制器)毅臊,M是指業(yè)務(wù)數(shù)據(jù), V是指用戶界面, C則是控制器. 在具體的業(yè)務(wù)場景中, C作為M和V之間的連接, 負(fù)責(zé)獲取輸入的業(yè)務(wù)數(shù)據(jù), 然后將處理后的數(shù)據(jù)輸出到界面上做相應(yīng)展示, 另外, 在數(shù)據(jù)有所更新時, C還需要及時提交相應(yīng)更新到界面展示理茎,因為M和V之間是完全隔離的, 所以在業(yè)務(wù)場景切換時, 通常只需要替換相應(yīng)的C, 復(fù)用已有的M和V便可快速搭建新的業(yè)務(wù)場景. MVC因其復(fù)用性, 大大提高了開發(fā)效率,但隨著業(yè)務(wù)數(shù)據(jù)的復(fù)雜,大量的代碼被放進(jìn)viewcontroller管嬉,導(dǎo)致很難測試皂林。
MVVM: 模型-視圖-視圖模型(Model-View-ViewModel),view和view controller正式聯(lián)系在一起,我們把它們視為一個組件蚯撩。視圖view仍然不能直接引用模型Model,當(dāng)然controller也不能础倍。相反,他們引用視圖模型view Model。view Model是一個放置用戶輸入驗證邏輯,視圖顯示邏輯,發(fā)起網(wǎng)絡(luò)請求和其他各種各樣的代碼的極好的地方求厕。
MVP:M : 邏輯Model層 V : 視圖層 P : protocol協(xié)議層,它將業(yè)務(wù)邏輯和業(yè)務(wù)展示也做了一層隔離, 對應(yīng)的就變成了MVCP. M和V功能不變, 原來的C現(xiàn)在只負(fù)責(zé)布局, 而所有的邏輯全都轉(zhuǎn)移到了P層.
3.為什么代理要用weak著隆?代理的delegate和dataSource有什么區(qū)別扰楼?block和代理的區(qū)別?
答:weak:指明該對象并不負(fù)責(zé)保持delegate這個對象呀癣,delegate這個對象的銷毀由外部控制
strong:該對象強(qiáng)引用delegate,外界不能銷毀delegate對象弦赖,會導(dǎo)致循環(huán)引用(Retain Cycles)
代理用weak為了防止循環(huán)引用
delegate控制的是UI项栏,是上層的東西;而datasource控制的是數(shù)據(jù)蹬竖。他們本質(zhì)都是回調(diào)沼沈,只是回調(diào)的對象不同
block 更輕型,使用更簡單币厕,能夠直接訪問上下文列另,這樣類中不需要存儲臨時數(shù)據(jù),使用 block 的代碼通常會在同一個地方旦装,這樣讀代碼也連貫页衙。delegate 更重一些,需要實現(xiàn)接口,它的方法分離開來店乐,很多時候需要存儲一些臨時數(shù)據(jù)艰躺,另外相關(guān)的代碼會被分離到各處,沒有 block 好讀眨八。
如果這個回調(diào)是一個不定期觸發(fā)腺兴,或者會多次觸發(fā)的,那么 Delegation 應(yīng)該更適合廉侧;如果這個回調(diào)是一個一次性的页响,并且和調(diào)用方法是單線性關(guān)系的,那么 Block 應(yīng)該更適合伏穆。
4.屬性的實質(zhì)是什么拘泞?包括哪幾個部分?屬性默認(rèn)的關(guān)鍵字都有哪些枕扫?@dynamic關(guān)鍵字和@synthesize關(guān)鍵字是用來做什么的陪腌?
答:
5.NSString為什么要用copy關(guān)鍵字,如果用strong會有什么問題烟瞧?(注意:這里沒有說用strong就一定不行诗鸭。使用copy和strong是看情況而定的)
6.如何令自己所寫的對象具有拷貝功能?
7.可變集合類 和 不可變集合類的 copy 和 mutablecopy有什么區(qū)別?如果是集合是內(nèi)容復(fù)制的話参滴,集合里面的元素也是內(nèi)容復(fù)制么强岸?
8.為什么IBOutlet修飾的UIView也適用weak關(guān)鍵字?
9.nonatomic和atomic的區(qū)別砾赔?atomic是絕對的線程安全么蝌箍?為什么?如果不是暴心,那應(yīng)該如何實現(xiàn)妓盲?
10.UICollectionView自定義layout如何實現(xiàn)?
11.用StoryBoard開發(fā)界面有什么弊端专普?如何避免悯衬?
12.進(jìn)程和線程的區(qū)別?同步異步的區(qū)別檀夹?并行和并發(fā)的區(qū)別筋粗?
線程間通信?
答:一個程序至少包含一個進(jìn)程炸渡,一個進(jìn)程至少包含一個線程娜亿,一個進(jìn)程中的所有線程共享當(dāng)前進(jìn)程所擁有的資源。
任務(wù)的執(zhí)行分為同步和異步蚌堵,同步執(zhí)行是發(fā)出一個調(diào)用時买决,等待執(zhí)行完返回,才繼續(xù)往下執(zhí)行,異步執(zhí)行是發(fā)出調(diào)用之后立即返回策州,繼續(xù)往下執(zhí)行.(例子: 同步: 你打電話問書店老板有沒有 <<多線程編程>> 這本書瘸味,如果是同步通信機(jī)制.書店老板會說,你稍等,”我查一下",然后開始查啊查,等查好了(可能是5秒够挂,也可能是一天)告訴你結(jié)果(返回結(jié)果).這其中你電話不掛斷.(等待返回結(jié)果)接收不到返回結(jié)果,不繼續(xù)下面的操作. 異步:書店老板直接告訴你我查一下啊,查好了打電話給你,然后直接掛電話了(不返回結(jié)果).你繼續(xù)該干哈干哈.等老板然后查好了,他會主動打電話給你,在這里老板通過“回電”這種方式來回調(diào).
)
并行:三個人同時吃一個饅頭(指兩個或兩個以上事件或活動在同一時刻發(fā)生旁仿。在多道程序環(huán)境下,并行性使多個程序同一時刻可在不同CPU上同時執(zhí)行孽糖。)
并發(fā):一個人同時吃三個饅頭(指兩個或兩個以上的事件或活動在同一時間間隔內(nèi)發(fā)生枯冈。并發(fā)的實質(zhì)是一個物理CPU(也可以多個物理CPU) 在若干道程序之間多路復(fù)用,并發(fā)性是
對有限物理資源強(qiáng)制行使多用戶共享以提高效率办悟。)
13.GCD的一些常用的函數(shù)尘奏?(group,barrier病蛉,信號量炫加,線程同步)
14.如何使用隊列來避免資源搶奪?
15.數(shù)據(jù)持久化的幾個方案(fmdb用沒用過)
答:plist文件(屬性列表)
preference(偏好設(shè)置)
NSKeyedArchiver(歸檔)
SQLite 3(FMDB)
CoreData
16.說一下AppDelegate的幾個方法铺然?從后臺到前臺調(diào)用了哪些方法俗孝?第一次啟動調(diào)用了哪些方法?從前臺到后臺調(diào)用了哪些方法魄健?
答: //當(dāng)程序第一次運行并且將要顯示窗口的時候執(zhí)行赋铝,在該方法中我們完成的操作(1)創(chuàng)建一個窗口對象,并且將窗口對象指定為程序的主窗口沽瘦。(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)入后臺的時候首先執(zhí)行程序?qū)⒁∠钴S該方法。
- (void)applicationWillResignActive:(UIApplication *)application {
//在該方法中我們經(jīng)常用來暫停正在執(zhí)行的任務(wù)析恋,讓時間計時器失效良哲。如果是游戲需要暫停游戲的運行。
}
//該方法當(dāng)應(yīng)用程序進(jìn)入后臺的時候調(diào)用 - (void)applicationDidEnterBackground:(UIApplication *)application {
//在該方法中經(jīng)常用來釋放一些公共資源绿满,保存用戶數(shù)據(jù)臂外,使時間計時器失效窟扑,保存足夠的狀態(tài)信息用來恢復(fù)應(yīng)用程序之前的狀態(tài)喇颁。
//當(dāng)應(yīng)用程序支持后臺運行的時候,該方法會取代applicationWillTerminate:方法
}
//當(dāng)程序進(jìn)入將要前臺的時候調(diào)用
- (void)applicationWillEnterForeground:(UIApplication *)application {
//該方法中我們經(jīng)常用來取消在程序進(jìn)入后臺的時候執(zhí)行的操作嚎货。
}
//應(yīng)用程序已經(jīng)變得活躍(應(yīng)用程序的運行狀態(tài)) - (void)applicationDidBecomeActive:(UIApplication *)application {
//重啟之前暫烷裒或者之前根本沒有運行的任務(wù)。如果程序之前在后臺殖属,必要的時候需要做界面的刷新操作姐叁。
}
//當(dāng)程序?qū)⒁顺龅臅r候調(diào)用,如果應(yīng)用程序支持后臺運行,該方法被applicationDidEnterBackground:替換
- (void)applicationWillTerminate:(UIApplication *)application {
}
17.NSCache優(yōu)于NSDictionary的幾點外潜?
答:NSCache勝過NSDictionary之處在于原环,當(dāng)系統(tǒng)資源將要耗盡時,它可以自動刪減緩存处窥。如果采用普通的字典嘱吗,那么就要自己編寫掛鉤,在系統(tǒng)發(fā)出“低內(nèi)存”通知時手工刪減緩存滔驾。
NSCache并不會“拷貝”鍵谒麦,而是會“保留”它。此行為用NSDictionary也可以實現(xiàn)哆致,然而需要編寫相當(dāng)復(fù)雜的代碼绕德。NSCache對象不拷貝鍵的原因在于:很多時候,鍵都是不支持拷貝操作的對象來充當(dāng)?shù)奶АR虼顺苌撸琋SCache不會自動拷貝鍵,所以說胞此,在鍵不支持拷貝操作的情況下城丧,該類用起來比字典更方便。另外豌鹤,NSCache是線程安全的亡哄,而NSDictionary則絕對不具備此優(yōu)勢。
18.知不知道Designated Initializer布疙?使用它的時候有什么需要注意的問題蚊惯?
答:是一個很有用的宏,充分發(fā)揮編譯器的特性幫我們找出初始化過程中可能存在的漏洞灵临,增強(qiáng)代碼的健壯性截型。
(1)每個類的正確初始化過程應(yīng)當(dāng)是按照從子類到父類的順序,依次調(diào)用每個類的Designated Initializer儒溉。并且用父類的Designated Initializer初始化一個子類對象宦焦,也需要遵從這個過程。
(2)如果子類指定了新的初始化器顿涣,那么在這個初始化器內(nèi)部必須調(diào)用父類的Designated Initializer波闹。并且需要重寫父類的Designated Initializer,將其指向子類新的初始化器涛碑。
(3)你可以不自定義Designated Initializer精堕,也可以重寫父類的Designated Initializer,但需要調(diào)用直接父類的Designated Initializer蒲障。
(4)如果有多個Secondary initializers(次要初始化器)歹篓,它們之間可以任意調(diào)用瘫证,但最后必須指向Designated Initializer。在Secondary initializers內(nèi)不能直接調(diào)用父類的初始化器庄撮。
(5)如果有多個不同數(shù)據(jù)源的Designated Initializer背捌,那么不同數(shù)據(jù)源下的Designated Initializer應(yīng)該調(diào)用相應(yīng)的[super (designated initializer)]。如果父類沒有實現(xiàn)相應(yīng)的方法洞斯,則需要根據(jù)實際情況來決定是給父類補(bǔ)充一個新的方法還是調(diào)用父類其他數(shù)據(jù)源的Designated Initializer载萌。比如UIView的initWithCoder調(diào)用的是NSObject的init。
(6)需要注意不同數(shù)據(jù)源下添加額外初始化動作的時機(jī)巡扇。
詳解:http://blog.jobbole.com/65762/
19.實現(xiàn)description方法能取到什么效果扭仁?
答:使用NSLog 和 %@ 輸出某個對象時,就會調(diào)用這個對象的 description 方法厅翔,它的返回值就是 NSString 字符串類型
20.objc使用什么機(jī)制管理對象內(nèi)存乖坠?
答:1).MRC(manual retain-release)手動內(nèi)存管理2).ARC(automatic reference counting)自動引用計數(shù)