1. 多線程的底層實(shí)現(xiàn)娩鹉?
1. 首先搞清楚什么是線程、什么是多線程
2. Mach是第一個(gè)以多線程方式處理任務(wù)的系統(tǒng)稚伍,因此多線程的底層實(shí)現(xiàn)機(jī)制是基于Mach的線程
3. 開(kāi)發(fā)中很少用Mach級(jí)的線程弯予,因?yàn)镸ach級(jí)的線程沒(méi)有提供多線程的基本特征,線程之間是獨(dú)立的
4. 開(kāi)發(fā)中實(shí)現(xiàn)多線程的方案
C語(yǔ)言的POSIX接口:#include <pthread.h>
OC的NSThread
C語(yǔ)言的GCD接口(性能最好个曙,代碼更精簡(jiǎn))
OC的NSOperation和NSOperationQueue(基于GCD)
2. 線程間怎么通信锈嫩?
1. performSelector:onThread:withObject:waitUntilDone:
2. NSMachPort
3. 網(wǎng)絡(luò)圖片處理問(wèn)題中怎么解決一個(gè)相同的網(wǎng)絡(luò)地址重復(fù)請(qǐng)求的問(wèn)題?
利用字典(圖片地址為key垦搬,下載操作為value)呼寸,具體可以查看SD緩存機(jī)制
4. 用NSOpertion和NSOpertionQueue處理A,B,C三個(gè)線程香府,要求執(zhí)行完A,B后才能執(zhí)行C,怎么做豌拙?
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSOperation *A = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"SuperLog------ NSOperationA");
}];
NSOperation *B = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"SuperLog------ NSOperationB");
}];
NSOperation *C = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"SuperLog------ NSOperationC");
}];
[C addDependency:A];
[C addDependency:B];
[queue addOperation:A];
[queue addOperation:B];
[queue addOperation:C];
5. 列舉cocoa中常見(jiàn)對(duì)幾種多線程的實(shí)現(xiàn),并談?wù)劧嗑€程安全的幾種解決辦法及多線程安全怎么控制镶苞?
1. 只在主線程刷新訪問(wèn)UI
2. 如果要防止資源搶奪肝断,得用synchronized進(jìn)行加鎖保護(hù)
3. 如果異步操作要保證線程安全等問(wèn)題, 盡量使用GCD(有些函數(shù)默認(rèn)就是安全的)
6. GCD內(nèi)部怎么實(shí)現(xiàn)的丈钙?
1. iOS和OS X的核心是XNU內(nèi)核非驮,GCD是基于XNU內(nèi)核實(shí)現(xiàn)的
2. GCD的API全部在libdispatch庫(kù)中
3. GCD的底層實(shí)現(xiàn)主要有Dispatch Queue和Dispatch Source
Dispatch Queue :管理block(操作)
Dispatch Source :處理事件
7. 你用過(guò)NSOperationQueue么?如果用過(guò)或者了解的話雏赦,你為什么要使用NSOperationQueue劫笙,實(shí)現(xiàn)了什么芙扎?請(qǐng)描述它和GCD的區(qū)別和類似的地方(提示:可以從兩者的實(shí)現(xiàn)機(jī)制和適用范圍來(lái)描述)。
1. GCD是純C語(yǔ)言的API填大,NSOperationQueue是基于GCD的OC版本封裝
2. GCD只支持FIFO的隊(duì)列戒洼,NSOperationQueue可以很方便地調(diào)整執(zhí)行順序、設(shè)置最大并發(fā)數(shù)量
3. NSOperationQueue可以在輕松在Operation間設(shè)置依賴關(guān)系允华,而GCD需要寫(xiě)很多的代碼才能實(shí)現(xiàn)
4. NSOperationQueue支持KVO圈浇,可以監(jiān)測(cè)operation是否正在執(zhí)行(isExecuted)、是否結(jié)束(isFinished)靴寂,是否取消(isCanceld)
5. GCD的執(zhí)行速度比NSOperationQueue快
任務(wù)之間不太互相依賴:GCD
任務(wù)之間有依賴\或者要監(jiān)聽(tīng)任務(wù)的執(zhí)行情況:NSOperationQueue
8. 既然提到GCD磷蜀,那么問(wèn)一下在使用GCD以及block時(shí)要注意些什么?它們兩是一回事兒?jiǎn)岚倬妫縝lock在ARC中和傳統(tǒng)的MRC中的行為和用法有沒(méi)有什么區(qū)別褐隆,需要注意些什么?
Block的使用注意:
1. block的內(nèi)存管理
2. 防止循環(huán)retian
非ARC(MRC):__block
ARC:__weak\__unsafe_unretained
9. 在異步線程中下載很多圖片剖踊,如果失敗了庶弃,該如何處理?請(qǐng)結(jié)合RunLoop來(lái)談?wù)劷鉀Q方案.(提示:在異步線程中啟動(dòng)一個(gè)RunLoop重新發(fā)送網(wǎng)絡(luò)請(qǐng)求蜜宪,下載圖片)虫埂。
1. 重新下載圖片
2. 下載完畢, 利用RunLoop的輸入源回到主線程刷新UIImageView
10. 怎么保證多人開(kāi)發(fā)進(jìn)行內(nèi)存泄露的檢查圃验?
1. 使用Analyze進(jìn)行代碼的靜態(tài)分析
2. 盡量使用ARC
11. 非自動(dòng)內(nèi)存管理情況下怎么做單例模式掉伏?
創(chuàng)建單例設(shè)計(jì)模式的基本步驟:
1. 聲明一個(gè)單件對(duì)象的靜態(tài)實(shí)例,并初始化為nil
2. 創(chuàng)建一個(gè)類的類工廠方法澳窑,當(dāng)且僅當(dāng)這個(gè)類的實(shí)例為nil時(shí)生成一個(gè)該類的實(shí)例
3. 實(shí)現(xiàn)NScopying協(xié)議斧散, 覆蓋allocWithZone:方法,確保用戶在直接分配和初始化對(duì)象時(shí)摊聋,不會(huì)產(chǎn)生另一個(gè)對(duì)象
4. 覆蓋release鸡捐、autorelease、retain麻裁、retainCount方法箍镜, 以此確保單例的狀態(tài)。
5. 在多線程的環(huán)境中煎源,注意使用@synchronized關(guān)鍵字或GCD色迂,確保靜態(tài)實(shí)例被正確的創(chuàng)建和初始化。
12. 對(duì)于類方法(靜態(tài)方法)默認(rèn)是autorelease的手销,所有類方法都會(huì)這樣嗎歇僧?
1. 系統(tǒng)自帶的絕大數(shù)類方法返回的對(duì)象,都是經(jīng)過(guò)autorelease的
13. block在ARC中和MRC中的用法有什么區(qū)別锋拖,需要注意什么诈悍?
1. 對(duì)于沒(méi)有引用外部變量的Block祸轮,無(wú)論在ARC還是非ARC下,類型都是__NSGlobalBlock__侥钳,這種類型的block可以理解成一種全局的block适袜,不需要考慮作用域問(wèn)題。同時(shí)慕趴,對(duì)他進(jìn)行Copy或者Retain操作也是無(wú)效的
2. 應(yīng)注意避免循環(huán)引用
14. 什么情況下會(huì)發(fā)生內(nèi)存泄漏和內(nèi)存溢出痪蝇?
1. 當(dāng)程序在申請(qǐng)內(nèi)存后,無(wú)法釋放已申請(qǐng)的內(nèi)存空間(例如一個(gè)對(duì)象或者變量使用完成后沒(méi)有釋放冕房,這個(gè)對(duì)象一直占用著內(nèi)存)躏啰,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴(yán)重耙册,無(wú)論多少內(nèi)存给僵,遲早會(huì)被占光。內(nèi)存泄露會(huì)最終會(huì)導(dǎo)致內(nèi)存溢出详拙!
2. 當(dāng)程序在申請(qǐng)內(nèi)存時(shí)帝际,沒(méi)有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory饶辙;比如申請(qǐng)了一個(gè)int蹲诀,但給它存了long才能存下的數(shù),那就是內(nèi)存溢出弃揽。
15. [NSArray arrayWithobject:(id)obj]
這個(gè)方法添加對(duì)象后脯爪,需要對(duì)這個(gè)數(shù)組做釋放操作嗎?
不需要這個(gè)對(duì)象被放到自動(dòng)釋放池中
16. 自動(dòng)釋放池底層怎么實(shí)現(xiàn)矿微?
自動(dòng)釋放池以棧的形式實(shí)現(xiàn):當(dāng)你創(chuàng)建一個(gè)新的自動(dòng)釋放池時(shí)痕慢,它將被添加到棧頂。當(dāng)一個(gè)對(duì)象收到發(fā)送autorelease消息時(shí)涌矢,它被添加到當(dāng)前線程的處于棧頂?shù)淖詣?dòng)釋放池中掖举,當(dāng)自動(dòng)釋放池被回收時(shí),它們從棧中被刪除娜庇, 并且會(huì)給池子里面所有的對(duì)象都會(huì)做一次release操作.
17. KVO內(nèi)部實(shí)現(xiàn)原理是什么塔次?
1. KVO是基于runtime機(jī)制實(shí)現(xiàn)的
2. 當(dāng)某個(gè)類的對(duì)象第一次被觀察時(shí),系統(tǒng)就會(huì)在運(yùn)行期動(dòng)態(tài)地創(chuàng)建該類的一個(gè)派生類名秀,在這個(gè)派生類中重寫(xiě)基類中任何被觀察屬性的setter方法励负。
3. 派生類在被重寫(xiě)的 setter 方法實(shí)現(xiàn)真正的通知機(jī)制(NSKVONotifying_Class)
18. 是否可以把比較耗時(shí)的操作放在NSNotificationCenter中?
如果在異步線程發(fā)的通知泰偿,那么可以執(zhí)行比較耗時(shí)的操作
如果在主線程發(fā)的通知,那么就不可以執(zhí)行比較耗時(shí)的操作
19. Foundation對(duì)象與Core Foundation對(duì)象有什么區(qū)別蜈垮?
1. Foundation對(duì)象是OC的耗跛,Core Foundation對(duì)象是C對(duì)象
2. 數(shù)據(jù)類型之間的轉(zhuǎn)換
ARC:__bridge_retained裕照、__bridge_transfer
非ARC: __bridge
20. 如何不用中間變量,用兩種方法交換A和B的值调塌?
A = A + B
B = A - B
A = A - B
A = A^B;
B = A^B;
A = A^B;
21. 簡(jiǎn)單描述下對(duì)單利模式設(shè)計(jì)的理解晋南?
節(jié)省內(nèi)存資源,一個(gè)應(yīng)用就一個(gè)對(duì)象羔砾。
22. runtime實(shí)現(xiàn)的機(jī)制是什么负间,如何用,用來(lái)做什么姜凄?你所使用的相關(guān)的頭文件或者某些方法的名稱有哪些政溃?
運(yùn)行時(shí)機(jī)制,runtime庫(kù)里面包含了跟類态秧、成員變量董虱、方法相關(guān)的API,比如獲取類里面的所有成員變量申鱼,為類動(dòng)態(tài)添加成員變量愤诱,動(dòng)態(tài)改變類的方法實(shí)現(xiàn),為類動(dòng)態(tài)添加新的方法等 需要導(dǎo)入<objc/message.h> <objc/runtime.h>
1. runtime捐友,運(yùn)行時(shí)機(jī)制淫半,它是一套C語(yǔ)言庫(kù)
2. 實(shí)際上我們編寫(xiě)的所有OC代碼,最終都是轉(zhuǎn)成了runtime庫(kù)的東西匣砖,比如類轉(zhuǎn)成了runtime庫(kù)里面的結(jié)構(gòu)體等數(shù)據(jù)類型科吭,方法轉(zhuǎn)成了runtime庫(kù)里面的C語(yǔ)言函數(shù),平時(shí)調(diào)方法都是轉(zhuǎn)成了objc_msgSend函數(shù)(所以說(shuō)OC有個(gè)消息發(fā)送機(jī)制)脆粥。因此砌溺,可以說(shuō)runtime是OC的底層實(shí)現(xiàn),是OC的幕后執(zhí)行者
3. 有了runtime庫(kù)变隔,能做什么事情呢规伐?runtime庫(kù)里面包含了跟類、成員變量匣缘、方法相關(guān)的API猖闪,比如獲取類里面的所有成員變量,為類動(dòng)態(tài)添加成員變量肌厨,動(dòng)態(tài)改變類的方法實(shí)現(xiàn)培慌,為類動(dòng)態(tài)添加新的方法等。因此柑爸,有了runtime吵护,想怎么改就怎么改
23. 是否使用Core Text或者Core Image等?如果使用過(guò),請(qǐng)談?wù)勀闶褂肅ore Text或者Core Image的體驗(yàn)馅而。
CoreText
1. 隨意修改文本的樣式
2. 圖文混排(純C語(yǔ)言)
3. 國(guó)外:Niumb
Core Image(濾鏡處理)
- 能調(diào)節(jié)圖片的各種屬性(對(duì)比度祥诽, 色溫, 色差等)
24. NSNotification和KVO的區(qū)別和用法是什么瓮恭?什么時(shí)候應(yīng)該使用通知雄坪,什么時(shí)候應(yīng)該使用KVO,它們的實(shí)現(xiàn)上有什么區(qū)別嗎屯蹦?如果用protocol和delegate(或者delegate的Array)來(lái)實(shí)現(xiàn)類似的功能可能嗎维哈?如果可能,會(huì)有什么潛在的問(wèn)題登澜?如果不能阔挠,為什么?(雖然protocol和delegate這種東西面試已經(jīng)面爛了…)帖渠?
通知比較靈活(1個(gè)通知能被多個(gè)對(duì)象接收谒亦, 1個(gè)對(duì)象能接收多個(gè)通知)
代理比較規(guī)范,但是代碼多(默認(rèn)是1對(duì)1)
KVO性能不好(底層會(huì)動(dòng)態(tài)產(chǎn)生新的類)空郊,只能監(jiān)聽(tīng)某個(gè)對(duì)象屬性的改變份招, 不推薦使用(1個(gè)對(duì)象的屬性能被多個(gè)對(duì)象監(jiān)聽(tīng),1個(gè)對(duì)象能監(jiān)聽(tīng)多個(gè)對(duì)象的其他屬性)
更詳細(xì)參考:
25. Block內(nèi)部的實(shí)現(xiàn)原理
Objective-C是對(duì)C語(yǔ)言的擴(kuò)展狞甚,block的實(shí)現(xiàn)是基于指針和函數(shù)指針
26. 有兩個(gè)數(shù)組a和b锁摔,大小都為n,通過(guò)交換a哼审,b中的元素谐腰,使sum(a)-sum(b)最小
算法題,百度自己學(xué)習(xí)涩盾。
思路
1. 計(jì)算 differ = sum(a) - sum(b)
2. 尋找 a b 數(shù)組中差值最接近differ/2 的元素
3. 交換元素
27. 如果后期需要增加數(shù)據(jù)庫(kù)中的字段怎么實(shí)現(xiàn)十气,如果不使用CoreData呢?
編寫(xiě)SQL語(yǔ)句來(lái)操作原來(lái)表中的字段
1. 增加表字段
ALTER TABLE 表名 ADD COLUMN 字段名 字段類型;
2. 刪除表字段
ALTER TABLE 表名 DROP COLUMN 字段名;
3. 修改表字段
ALTER TABLE 表名 RENAME COLUMN 舊字段名 TO 新字段名;
28. SQLite數(shù)據(jù)存儲(chǔ)是怎么用春霍?
1. 添加SQLite動(dòng)態(tài)庫(kù)
2. 導(dǎo)入主頭文件:#import <sqlite3.h>
3. 利用C語(yǔ)言函數(shù)創(chuàng)建/打開(kāi)數(shù)據(jù)庫(kù)砸西,編寫(xiě)SQL語(yǔ)句
29. 簡(jiǎn)單描述下客戶端的緩存機(jī)制?
1. 緩存可以分為:內(nèi)存數(shù)據(jù)緩存址儒、數(shù)據(jù)庫(kù)緩存芹枷、文件緩存
2. 每次想獲取數(shù)據(jù)的時(shí)候
2.1 先檢測(cè)內(nèi)存中有無(wú)緩存
2.2 再檢測(cè)本地有無(wú)緩存(數(shù)據(jù)庫(kù)\文件)
2.3 最終發(fā)送網(wǎng)絡(luò)請(qǐng)求
2.4 將服務(wù)器返回的網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行緩存(內(nèi)存、數(shù)據(jù)庫(kù)莲趣、文件)鸳慈,以便下次讀取
30. 你實(shí)現(xiàn)過(guò)多線程的Core Data么?NSPersistentStoreCoordinator喧伞,NSManagedObjectContext和NSManagedObject中的哪些需要在線程中創(chuàng)建或者傳遞走芋?你是用什么樣的策略來(lái)實(shí)現(xiàn)的绩郎?
1. CoreData是對(duì)SQLite數(shù)據(jù)庫(kù)的封裝
2. CoreData中的NSManagedObjectContext在多線程中不安全
3. 如果想要多線程訪問(wèn)CoreData的話,最好的方法是一個(gè)線程一個(gè)NSManagedObjectContext
4. 每個(gè)NSManagedObjectContext對(duì)象實(shí)例都可以使用同一個(gè)NSPersistentStoreCoordinator實(shí)例翁逞,這是因?yàn)镹SManagedObjectContext會(huì)在便用NSPersistentStoreCoordinator前上鎖
31. Core Data數(shù)據(jù)遷移
32. 怎么解決緩存池滿的問(wèn)題(cell)
ios中不存在緩存池滿的情況嗽上,因?yàn)橥ǔN覀僫os中開(kāi)發(fā),對(duì)象都是在需要的時(shí)候才會(huì)創(chuàng)建熄攘,有種常用的說(shuō)話叫做懶加載,還有在UITableView中一般只會(huì)創(chuàng)建剛開(kāi)始出現(xiàn)在屏幕中的cell彼念,之后都是從緩存池里取挪圾,不會(huì)在創(chuàng)建新對(duì)象。緩存池里最多也就一兩個(gè)對(duì)象逐沙,緩存池滿的這種情況一般在開(kāi)發(fā)java中比較常見(jiàn)哲思,java中一般把最近最少使用的對(duì)象先釋放。
33. CAAnimation的層級(jí)結(jié)構(gòu)
Core Animation Programming Guide
graph TB
A(CAAnimation) --> B1(CAPropertyAnimation)
A --> B2(CAAnimationGroup)
A --> B3(CATransition)
B1 --> C1(CABasicAnimation)
B1 --> C2(CAKeyframeAnimation)
C1 --> D(CASpringAnimation)
34. 按鈕或者其它UIView控件的事件傳遞的具體過(guò)程
如何找到最合適的視圖
1. 自己是否能接收觸摸事件
2. 觸摸點(diǎn)是否在自己身上
3. 從后往前遍歷子控件吩案,重復(fù)前面的兩個(gè)步驟
4. 如果沒(méi)有符合條件的子控件棚赔,那么自己最適合處理
35. 控制器View的生命周期及相關(guān)函數(shù)是什么?你在開(kāi)發(fā)中是如何用的徘郭?
1. 首先判斷控制器是否有視圖靠益,如果沒(méi)有就調(diào)用loadView方法創(chuàng)建(storyboard/代碼)
2. 隨后調(diào)用viewDidLoad,可以進(jìn)行下一步的初始化操作(只會(huì)被調(diào)用一次)
3. 在視圖顯示之前調(diào)用viewWillAppear(該函數(shù)可以多次調(diào)用)
4. viewDidAppear
3. 在視圖顯示之前調(diào)用viewWillDisappear残揉;該函數(shù)可以多次調(diào)用(如需要)
5. 在布局變化前后胧后,調(diào)用viewWill/DidLayoutSubviews處理相關(guān)信息
36. NSRunLoop的實(shí)現(xiàn)機(jī)制,及在多線程中如何使用抱环?
NSRunLoop是iOS消息機(jī)制的處理模式
1. NSRunLoop的主要作用:控制NSRunLoop里面線程的執(zhí)行和休眠壳快,在有事情做的時(shí)候使當(dāng)前NSRunLoop控制的線程工作,沒(méi)有事情做讓當(dāng)前NSRunLoop的控制的線程休眠镇草。
2. NSRunLoop 就是一直在循環(huán)檢測(cè)眶痰,從線程start到線程end,檢測(cè)inputsource(如點(diǎn)擊梯啤,雙擊等操作)異步事件竖伯,檢測(cè)timesource同步事件,檢測(cè)到輸入源會(huì)執(zhí)行處理函數(shù)条辟,首先會(huì)產(chǎn)生通知黔夭,corefunction向線程添加runloop observers來(lái)監(jiān)聽(tīng)事件,意在監(jiān)聽(tīng)事件發(fā)生時(shí)來(lái)做處理羽嫡。
3. runloopmode是一個(gè)集合本姥,包括監(jiān)聽(tīng):事件源,定時(shí)器杭棵,以及需通知的runloop observers
多線程中如何使用婚惫?
1. 只有在為你的程序創(chuàng)建次線程的時(shí)候氛赐,才需要運(yùn)行run loop。對(duì)于程序的主線程而言先舷,run loop是關(guān)鍵部分艰管。Cocoa提供了運(yùn)行主線程run loop的代碼同時(shí)也會(huì)自動(dòng)運(yùn)行run loop。iOS程序UIApplication中的run方法在程序正常啟動(dòng)的時(shí)候就會(huì)啟動(dòng)run loop蒋川。如果你使用xcode提供的模板創(chuàng)建的程序牲芋,那你永遠(yuǎn)不需要自己去啟動(dòng)run loop
2. 在多線程中,你需要判斷是否需要run loop捺球。如果需要run loop缸浦,那么你要負(fù)責(zé)配置run loop并啟動(dòng)。你不需要在任何情況下都去啟動(dòng)run loop氮兵。比如裂逐,你使用線程去處理一個(gè)預(yù)先定義好的耗時(shí)極長(zhǎng)的任務(wù)時(shí),你就可以毋需啟動(dòng)run loop泣栈。Run loop只在你要和線程有交互時(shí)才需要
37. iOS7之前卜高,后臺(tái)執(zhí)行內(nèi)容有幾種形式,都是什么南片?
一般的應(yīng)用在進(jìn)入后臺(tái)的時(shí)候可以獲取一定時(shí)間來(lái)運(yùn)行相關(guān)任務(wù)掺涛,也就是說(shuō)可以在后臺(tái)運(yùn)行一小段時(shí)間(10S左右)。
1. 后臺(tái)播放音樂(lè)
2. 后臺(tái)GPS跟蹤
3. 后臺(tái)voip支持
38. 簡(jiǎn)單說(shuō)一下APP的啟動(dòng)過(guò)程疼进,從main文件開(kāi)始說(shuō)起
程序啟動(dòng)分為兩類:
1. 有storyboard
2. 沒(méi)有storyboard
情況一:
1.main函數(shù)
2.UIApplicationMain
* 創(chuàng)建UIApplication對(duì)象
* 創(chuàng)建UIApplication的delegate對(duì)象
3.根據(jù)Info.plist獲得最主要storyboard的文件名鸽照,加載最主要的storyboard(有storyboard)
* 創(chuàng)建UIWindow
* 創(chuàng)建和設(shè)置UIWindow的rootViewController
* 顯示窗口
情況二:
1.main函數(shù)
2.UIApplicationMain
* 創(chuàng)建UIApplication對(duì)象
* 創(chuàng)建UIApplication的delegate對(duì)象
3.delegate對(duì)象開(kāi)始處理(監(jiān)聽(tīng))系統(tǒng)事件(沒(méi)有storyboard)
* 程序啟動(dòng)完畢的時(shí)候, 就會(huì)調(diào)用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow
* 創(chuàng)建和設(shè)置UIWindow的rootViewController
* 顯示窗口
39. 把程序自己關(guān)掉和程序進(jìn)入后臺(tái)颠悬,遠(yuǎn)程推送的區(qū)別矮燎?
1. 關(guān)掉后不執(zhí)行任何代碼,不能處理事件
2. 應(yīng)用程序進(jìn)入后臺(tái)狀態(tài)不久后轉(zhuǎn)入掛起狀態(tài)赔癌。在這種狀態(tài)下诞外,應(yīng)用程序不執(zhí)行任何代碼,并有可能在任意時(shí)候從內(nèi)存中刪除灾票。只有當(dāng)用戶再次運(yùn)行此應(yīng)用峡谊,應(yīng)用才會(huì)從掛起狀態(tài)喚醒,代碼得以繼續(xù)執(zhí)行
3. 或者進(jìn)入后臺(tái)時(shí)開(kāi)啟多任務(wù)狀態(tài)刊苍,保留在內(nèi)存中既们,這樣就可以執(zhí)行系統(tǒng)允許的動(dòng)作
4. 遠(yuǎn)程推送是由遠(yuǎn)程服務(wù)器上的程序發(fā)送到APNS,再由APNS把消息推送至設(shè)備上的程序正什,當(dāng)應(yīng)用程序收到推送的消息會(huì)自動(dòng)調(diào)用特定的方法執(zhí)行事先寫(xiě)好的代碼
5. 本地通知和遠(yuǎn)程推送通知對(duì)基本概念和用法啥纸?
* 本地通知和遠(yuǎn)程推送通知都可以向不在前臺(tái)運(yùn)行的應(yīng)用發(fā)送消息,這種消息既可能是即將發(fā)生的事件婴氮,也可能是服務(wù)器的新數(shù)據(jù).不管是本地通知還是遠(yuǎn)程通知斯棒,他們?cè)诔绦蚪缑娴娘@示效果相同盾致,都可能顯示為一段警告信息或應(yīng)用程序圖標(biāo)上的微章.
* 本地通知和遠(yuǎn)程推送通知的基本目的都是讓?xiě)?yīng)用程序能夠通知用戶某些事情,而且不需要應(yīng)用程序在前臺(tái)運(yùn)行.二者的區(qū)別在于本地通知由本應(yīng)用負(fù)責(zé)調(diào)用荣暮,只能從當(dāng)前設(shè)備上的iOS發(fā)出庭惜, 而遠(yuǎn)程通知由遠(yuǎn)程服務(wù)器上的程序發(fā)送到APNS,再由APNS把消息推送至設(shè)備上的程序
40. SIP是什么穗酥?
1. SIP(Session Initiation Protocol)护赊,會(huì)話發(fā)起協(xié)議
2. SIP是建立VOIP連接的 IETF 標(biāo)準(zhǔn),IETF是全球互聯(lián)網(wǎng)最具權(quán)威的技術(shù)標(biāo)準(zhǔn)化組織
3. 所謂VOIP砾跃,就是網(wǎng)絡(luò)電話百揭,直接用互聯(lián)網(wǎng)打電話,不用耗手機(jī)話費(fèi)
41. 有些圖片加載的比較慢怎么處理蜓席?你是怎么優(yōu)化程序的性能的?
1. 圖片下載放在異步線程
2. 圖片下載過(guò)程中使用占位圖片
3. 如果圖片較大课锌,可以考慮多線程斷點(diǎn)下載
42. 你實(shí)現(xiàn)過(guò)一個(gè)框架或者庫(kù)以供別人使用么厨内?如果有,請(qǐng)談一談構(gòu)建框架或者庫(kù)時(shí)候的經(jīng)驗(yàn)渺贤;如果沒(méi)有雏胃,請(qǐng)?jiān)O(shè)想和設(shè)計(jì)框架的public的API,并指出大概需要如何做志鞍,需要注意一些什么方面瞭亮,來(lái)使別人容易地使用你的框架。
1. 提供給外界的接口功能是否實(shí)用固棚、夠用
2. 能不能根據(jù)類名统翩、方法名就猜出接口的具體作用
3. 提供的參數(shù)是否夠用、調(diào)用起來(lái)是否簡(jiǎn)單
4. 要不要再導(dǎo)入依賴其他的框架
43. App需要加載超大量的數(shù)據(jù)此洲,給服務(wù)器發(fā)送請(qǐng)求厂汗,但是服務(wù)器卡住了如何解決?
1. 設(shè)置請(qǐng)求超時(shí)
2. 給用戶提示請(qǐng)求超時(shí)
3. 根據(jù)用戶操作再次請(qǐng)求數(shù)據(jù)
44. 利用NSNotificationCenter實(shí)現(xiàn)跨多控制器傳輸數(shù)據(jù)和消息中用同步還是異步呜师?
1. 如果通知是在主線程發(fā)出娶桦,那么接收通知的方法中的耗時(shí)操作要放到異步線程中
2. 如果通知實(shí)在異步線程中發(fā)出,那么接收通知后調(diào)用的方法會(huì)默認(rèn)在異步線程中執(zhí)行
45. SDWebImage具體如何實(shí)現(xiàn)汁汗?
1. 利用NSOperationQueue和NSOperation下載圖片衷畦, 還使用了GCD的一些函數(shù)(解碼GIF圖片)
2. 利用URL作為key,NSOperation作為value
3. 利用URL作為key知牌,UIImage作為value
待完善...
46. AFN 與 ASI 有什么區(qū)別
1. AFN基于NSURL祈争,ASI基于底層的CFNetwork框架,因此ASI的性能優(yōu)于AFN
2. AFN采取block的方式處理請(qǐng)求角寸,ASI最初采取delegate的方式處理請(qǐng)求铛嘱,后面也增加了block的方式
3. AFN只封裝了一些常用功能暖释,滿足基本需求,直接忽略了很多擴(kuò)展功能墨吓,比如沒(méi)有封裝同步請(qǐng)求球匕;ASI提供的功能較多,預(yù)留了各種接口和工具供開(kāi)發(fā)者自行擴(kuò)展
4. AFN直接解析服務(wù)器返回的JSON帖烘、XML等數(shù)據(jù)亮曹,而ASI比較原始,返回的是NSData二進(jìn)制數(shù)據(jù)
47. Runloop定時(shí)源和輸入源
1. 你創(chuàng)建的程序不需要顯示的創(chuàng)建run loop秘症;每個(gè)線程照卦,包括程序的主線程(main thread)都有與之相應(yīng)的run loop對(duì)象, 主線程會(huì)自行創(chuàng)建并運(yùn)行run loop
2. Runloop處理的輸入事件有兩種不同的來(lái)源:輸入源(input source)和定時(shí)源(timer source)
3. 輸入源傳遞異步消息乡摹,通常來(lái)自于其他線程或者程序役耕。定時(shí)源則傳遞同步消息,在特定時(shí)間或者一定的時(shí)間間隔發(fā)生
48. 如果在網(wǎng)絡(luò)數(shù)據(jù)處理過(guò)程中聪廉,發(fā)現(xiàn)一處比較卡瞬痘,一般怎么解決
1. 檢查網(wǎng)絡(luò)請(qǐng)求操作是否被放在主線程了
2. 看看異步請(qǐng)求的數(shù)量是否太多了(子線程數(shù)量)
3. 數(shù)據(jù)量是否太大?如果太大板熊,先清除一些不必要的對(duì)象(看不見(jiàn)的數(shù)據(jù)框全、圖片)
4. 手機(jī)CPU使用率和內(nèi)存問(wèn)題
49. 怎么解決sqlite鎖定的問(wèn)題
1. 設(shè)置數(shù)據(jù)庫(kù)鎖定的處理函數(shù)
int sqlite3_busy_handler(sqlite3*, int(*)(void*干签,int)津辩, void*);
2. 設(shè)定鎖定時(shí)的等待時(shí)間
int sqlite3_busy_timeout(sqlite3*, 60);