J_Knight_ iOS 高級面試題 實戰題解答以及一些擴展性連接

iOS 實戰題html

AppDelegate如何瘦身?ios

1.命令模式git

2.分類程序員

3.QTEventBus 實現一個優雅的iOS事件總線github

4.組合模式macos

解釋一下命令模式和組合模式的區別設計模式

命令模式:將一個請求封裝爲一個對象,從而使你可不用不一樣的請求對客戶端進行參數化,對請求排隊或記錄請求的日誌,以及支持可撤銷的操做。數組

舉例:燒烤攤:客戶->燒烤者 燒烤店:客戶->服務員->燒烤師傅緩存

命令模式優勢:安全

1:他比較設計一個命令隊列

2:在須要的狀況下,能夠較容易的。

3:容許接受請求的一放決定是否否覺請求了

4:能夠容易實現對請求的撤銷和重作,

組合模式(Composite Pattern),又叫部分總體模式,是用於把一組類似的對象看成一個單一的對象。組合模式依據樹形結構來組合對象,用來表示部分以及總體層次。這種類型的設計模式屬於結構型模式,它建立了對象組的樹形結構。

何時用組合模式:但你發現需求中是體現部分與總體層次的結構時,以及你但願用戶能夠忽略組合對象與單個對象的不一樣,統一的使用組合結構中的全部對象是,就該考慮用組合模式了。

組合模式的好處:組合模式這樣就定義了包含人力資源部和財務部這些基本對象和分公司,辦事處等組合對象類的層次結構,基本對象能夠背組合成更加複雜的組合對象,而這個組合對象又能夠被組合,這樣不斷的遞歸下去,客戶代碼中,任何代碼中,任何用到基本的對象的地方均可以用組合的對象。

組合模式三個關鍵點:add remove dept 增長 移除 深度

反射是什麼?能夠舉出幾個應用場景麼?(知道多少說多少)

反射機制有三個用途:

1.得到Class

2.檢查繼承關係

3.動態的調用方法

有哪些場景是NSOperation比GCD更容易實現的?(或是NSOperation優於GCD的幾點,知道多少說多少)

<1>GCD GCD是iOS4.0推出的,主要針對多核cpu作了優化,是C語言的技術 GCD是將任務(block)添加到隊列(串行/並行/全局/主隊列),而且以同步/異步的方式執行任務的函數,任務的取出遵循隊列的FIFO原則:先進先出,後進後出

GCD提供了一些NSOperation不具有的功能

一次性執行:能夠保證某一段代碼在程序運行的過程當中只被執行一次;一次性執行是線程安全的,在多線程環境下也是隻執行一次;應用場景:設計單例模式 延遲執行:既實現等待多長時間後在哪一個隊列中執行什麼代碼塊 調度組:監聽一組異步任務執行結束以後,咱們可以獲得統一的通知;注意:在其調度組內的任務執行完畢後執行後面的」刷新主界面」方法與」玩完」之間的執行沒有前後順序;例如:

<2>NSOperation

NSOperation是iOS2.0推出的,iOS4.0以後重寫了NSOperation NSOperation將操做(異步的任務)添加到隊列(併發隊列),就會執行指定操做的方法

NSOperation裏提供的方便的操做

最大併發數,

隊列的暫定/繼續

取消隊列中全部的操做

指定操做之間的依賴關係(GCD能夠用同步實現,可是比較麻煩)

•同步和異步決定了要不要開啓新的線程(同步不開,異步開)

同步:在當前線程中執行任務,不具有開啓新線程的能力

異步:在新的線程中執行任務,具有開啓新線程的能力

•串行和併發決定了任務的執行方式

併發:多個任務併發(同時)執行

串行:一個任務執行完畢後,再執行下一個任務

•當任務是異步的時候,隊列決定了開啓多少條線程

串行隊列:只開一條

併發隊列:能夠開啓多條

•主隊列特色:主隊列中的任務,只有主線程空閒的時候纔會調度任務執行 主隊列又叫全局串行隊列,程序啓動的時候就建立了主隊列,在使用的時候不須要建立,直接GET.主隊列中的任務是要在主線程執行的.

•主隊列,異步任務

不開線程,同步執行

•主隊列,同步執行

同步執行:若是第一個任務沒有執行,就繼續等待第一個任務執行完成,再執行下一個任務此時互相等待,程序沒法往下執行(死鎖)

•全局隊列本質就是併發隊列

dispatch_get_global_queue(0,0);

•全局隊列和併發隊列的區別

併發隊列有名稱,能夠跟蹤錯誤,全局隊列沒有

全局隊列在ARC中不須要考慮釋放內存,dispatch_release(q);不容許調用。併發隊列在MRC中須要手動釋放內存,由於併發隊列是create建立出來的在MRC中見到create就要release,全局隊列不須要release(只有一個) 通常咱們使用全局隊列,由於使用起來更加簡單

<3>綜合比較其各自使用範圍以下 性能:

①:GCD更接近底層,而NSOperationQueue則更高級抽象,因此GCD在追求性能的底層操做來講,是速度最快的。這取決於使用Instruments進行代碼性能分析,若有必要的話

②:從異步操做之間的事務性,順序行,依賴關係。GCD須要本身寫更多的代碼來實現,而NSOperationQueue已經內建了這些支持

③:若是異步操做的過程須要更多的被交互和UI呈現出來,NSOperationQueue會是一個更好的選擇。底層代碼中,任務之間不太互相依賴,而須要更高的併發能力,GCD則更有優點

App 啓動優化策略?最好結合啓動流程來講(main()函數的執行先後都分別說一下,知道多少說多少)

https://juejin.im/entry/597a9abff265da3e390bc58f       iOS 啓動優化
http://www.cocoachina.com/ios/20180927/25038.html    App啓動速度優化
https://juejin.im/post/5baa3eb76fb9a05cdb103c74        你的 APP 爲什麼啓動那麼慢?
https://juejin.im/post/5a31190751882559e225a775         [iOS]一次立竿見影的啓動時間優化
http://www.cocoachina.com/ios/20180802/24423.html    iOS啓動時間優化
http://www.cocoachina.com/ios/20180521/23434.html 【高級iOS】啓動時間優化
https://www.jianshu.com/p/c14987eee107       如何精確度量 iOS App 的啓動時間


linkers and loaders
http://www.codeproject.com/Articles/187181/Dynamic-
Linking-of-Imported-Functions-in-Mach-O
http://blog.imjun.net/2016/10/08/
iOS (冰和火之歌)
WWDC 2016 Optimizing App Startup Time

https://blog.csdn.net/bjtufang/article/details/50628310
Mach-O文件格式和程序從加載到執行過程

https://blog.csdn.net/fishmai/article/details/51419824 dyld源碼分析-動態加載main的流程和load函數執行的流程

https://blog.csdn.net/Hello_Hwc/article/details/78317863?locationNum=9&fps=1 深刻理解iOS App的啓動過程

https://zhuanlan.zhihu.com/p/24875905?refer=macos-sec dylib動態庫加載過程分析

https://blog.csdn.net/sharemyfree/article/details/44036481 轉 iOS 系列譯文:Mach-O 可執行文件

http://blog.51cto.com/haidragon/2142524 MachOView源碼(LoadCommands.mm)

https://www.jianshu.com/p/231b1cebf477 iOS App從點擊到啓動

https://njafei.github.io/2017/05/04/runtime/ iOS Runtime 詳解

https://blog.csdn.net/vincentiss/article/details/54617915 深刻剖析 iOS 編譯 Clang / LLVM

http://www.cocoachina.com/ios/20180802/24423.html iOS啓動時間優化

gcc爲函數提供了幾種類型的屬性,其中包含:構造函數(constructors)和析構函數(destructors)。 程序員應當使用相似下面的方式來指定這些屬性:

attribute((constructor)) // 在main函數被調用以前調用 attribute((destructor)) // 在main函數被調用以後調

http://www.cocoachina.com/ios/20170716/19876.html iOS程序啓動->dyld加載->runtime初始化(初識) https://www.jianshu.com/p/231b1cebf477 iOS App從點擊到啓動

https://blog.csdn.net/fishmai/article/details/51419824 dyld源碼分析-動態加載main的流程和load函數執行的流程
複製代碼

App 無痕埋點的思路瞭解麼?你認爲理想的無痕埋點系統應該具有哪些特色?(知道多少說多少)

無埋點數據收集SDK

你知道有哪些狀況會致使app崩潰,分別能夠用什麼方法攔截並化解?(知道多少說多少)

Unrecognized Selector Sent to Instance

NSArray,NSMutableArray,NSDictonary,NSMutableDictionary NSString

KVO

Zombie Pointer

NSTimer

NSNotification

Unrecognized Selector Sent to Instance

[https://github.com/chenfanfang/AvoidCrash](AvoidCrash)

目前能夠防止崩潰的方法有

unrecognized selector sent to instance
1. 對」unrecognized selector sent to instance」防止崩潰的處理
NSArray
1. NSArray的快速建立方式 NSArray *array = @[@"chenfanfang", @"AvoidCrash"]; //這種建立方式其實調用的是2中的方法

2. +(instancetype)arrayWithObjects:(const id  _Nonnull __unsafe_unretained *)objects count:(NSUInteger)cnt

3. 經過下標獲取元素 array[100]、[array objectAtIndex:100]

- (id)objectAtIndex:(NSUInteger)index
4. - (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes

5. - (void)getObjects:(__unsafe_unretained id _Nonnull *)objects range:(NSRange)range

NSMutableArray
1. 經過下標獲取元素 array[100]、[array objectAtIndex:100]
- (id)objectAtIndex:(NSUInteger)index
2. - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx
3. - (void)removeObjectAtIndex:(NSUInteger)index
4. - (void)insertObject:(id)anObject atIndex:(NSUInteger)index
5. - (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes
6. - (void)getObjects:(__unsafe_unretained id _Nonnull *)objects range:(NSRange)range
NSDictionary
1. NSDictionary的快速建立方式 NSDictionary *dict = @{@"frameWork" : @"AvoidCrash"}; //這種建立方式其實調用的是2中的方法
2. +(instancetype)dictionaryWithObjects:(const id _Nonnull __unsafe_unretained *)objects forKeys:(const id<NSCopying> _Nonnull __unsafe_unretained *)keys count:(NSUInteger)cnt
NSMutableDictionary
1. - (void)setObject:(id)anObject forKey:(id<NSCopying>)aKey
2. - (void)removeObjectForKey:(id)aKey
NSString
1. - (unichar)characterAtIndex:(NSUInteger)index
2. - (NSString *)substringFromIndex:(NSUInteger)from
3. - (NSString *)substringToIndex:(NSUInteger)to {
4. - (NSString *)substringWithRange:(NSRange)range {
5. - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
6. - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange
7. - (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement
NSMutableString
1. 因爲NSMutableString是繼承於NSString,因此這裏和NSString有些一樣的方法就不重複寫了
2. - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString
3. - (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc
4. - (void)deleteCharactersInRange:(NSRange)range
KVC
1.- (void)setValue:(id)value forKey:(NSString *)key
2.- (void)setValue:(id)value forKeyPath:(NSString *)keyPath
3.- (void)setValue:(id)value forUndefinedKey:(NSString *)key //這個方法通常用來重寫,不會主動調用
4.- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *,id> *)keyedValues
NSAttributedString
1.- (instancetype)initWithString:(NSString *)str
2.- (instancetype)initWithAttributedString:(NSAttributedString *)attrStr
3.- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary<NSString *,id> *)attrs
NSMutableAttributedString
1.- (instancetype)initWithString:(NSString *)str
2.- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary<NSString *,id> *)attrs

複製代碼
[https://github.com/jezzmemo/JJException](JJException)

保護App,通常常見的問題不會致使閃退,加強App的健壯性,同時會將錯誤拋出來,根據每一個App自身的日誌渠道記錄,下次迭代或者熱修復如下問題.

 Unrecognized Selector Sent to Instance(方法不存在異常)

 NSNull(方法不存在異常)

 NSArray,NSMutableArray,NSDictonary,NSMutableDictionary(數組越界,key-value參數異常)

 KVO(忘記移除keypath致使閃退)

 Zombie Pointer(野指針)

 NSTimer(忘記移除致使內存泄漏)

 NSNotification(忘記移除致使異常)

 NSString,NSMutableString,NSAttributedString,NSMutableAttributedString(下標越界以及參數nil異常)
複製代碼

如需想了解深刻各位老鐵,請搜索對應的源碼解析

你知道有哪些狀況會致使app卡頓,分別能夠用什麼方法來避免?(知道多少說多少)

分cpu卡和gpu卡頓。
主線程耗時操做
滑動頁面渲染卡頓(離屏渲染)
圖像渲染解碼
「你知道有哪些狀況會致使app卡頓」我覺的這個問題有點尬,有點不怎麼會回答了,

1.避免主線程阻塞 afnetworking已經作了回到主線程操做,若是有數據耗時的數據處理,請用多線程
1.2 將cell高度和 cell裏的控件的frame緩存在model裏
1.3 減小cell內部控件的層級
1.4 經過覆蓋圓角圖片來實現頭像的圓角效果
2. 按需加載cell
2.1 在cellForRow:方法裏只加載可見cell
2.2 監聽tableview的快速滾動,保存目標滾動範圍的先後三行的索引
3. 異步處理cell
3.1 異步加載網絡圖片
3.2 異步繪製本地圖片
3.3 異步繪製UIView
3.4 異步繪製NSString
3.5 異步繪製UILabel
4.  複用  等

https://mp.weixin.qq.com/s?__biz=MzA5NzMwODI0MA==&mid=2647761180&idx=1&sn=67e69d424f4fb6b5a77ed8cc5cbca7db&chksm=8887da23bff053354d17806e2d02a5bd5b1008be45a7f5eee6c784a0e1cf2b7d3df8dfd63372&mpshare=1&scene=1&srcid=10113fj7OH7WMuzM5lKM6c63&rd2werd=1#wechat_redirect . iOS 界面渲染流程分析
 http://www.cocoachina.com/ios/20180417/23049.html .  深刻理解 iOS Rendering Process . 
 http://www.cocoachina.com/ios/20180830/24599.html    iOS性能優化系列篇之「列表流暢度優化」
http://www.cocoachina.com/ios/20180806/24466.html Objective-C Message Throttle and Debounce(Objective-C消息節流和防抖
 http://www.cocoachina.com/ios/20180806/24469.html iOS 性能優化 Instruments 檢測 App 耗電量實戰
 http://www.cocoachina.com/ios/20180720/24246.html  iOS-性能優化深刻探究 http://www.cocoachina.com/ios/20180712/24128.html  iOS 界面性能優化淺析 
http://www.cocoachina.com/ios/20180713/24147.html   深刻剖析 iOS 性能優化
 http://www.cocoachina.com/ios/20180703/24024.html  iOS 保持頁面流暢技巧
http://www.cocoachina.com/ios/20180412/22990.html  iOS 性能優化總結
 http://www.cocoachina.com/ios/20180625/23919.html  iOS高效圖片IO框架是如何煉成的
http://www.cocoachina.com/ios/20180511/23354.html  iOS性能調優之--tableView優化
http://www.cocoachina.com/ios/20180323/22737.htmlUITableView 的優化技巧
http://www.cocoachina.com/ios/20180309/22514.html   iOS 性能優化探索
http://www.cocoachina.com/ios/20180207/22197.html iOS開發——實戰UITableview深度優化
http://www.cocoachina.com/ios/20180213/22282.html  《高性能iOS 應用開發》之下降你 APP 的電量消耗
https://blog.csdn.net/zhaizu/article/details/51882768    理解 VSync
https://rannie.github.io/ios/2016/02/22/ios-display-opengles.html  OpenGL ES 基礎以及 iOS 設備渲染探究優化
https://www.jianshu.com/p/997c05a77a7f   iOS繪製與渲染--GPU和OpenGL


複製代碼

這些都資料都是本身日常學習中收集下來的學習連接,寫個博客分享給你們,但願你們能幫助你們,如文中有什麼不對的地方請留言了,筆者進行改正了,由於這些資料都是之前寫的一塊一塊的,這兩天整理了一下,分享一下給大夥了,但願各位老鐵都能找到一個好的工做。

各位老鐵本人水平有限,若有不充分的歡迎各位老鐵留言補充

相關文章
相關標籤/搜索