iOS不想看的一些Question

搜集一些總是不愿意面對的東西耸彪,答案自由發(fā)揮……

1. objc在向一個對象發(fā)送消息時碌上,發(fā)生了什么掀鹅?objc中向一個nil對象發(fā)送消息將會發(fā)生什么揽碘?如果向一個nil對象發(fā)消息不會crash的話次屠,那么unrecognized selector sent to instance的錯誤是怎么回事?
  1. 根據(jù)對象的 isa 指針找到類對象 id园匹,在查詢類對象里面的 methodLists 方法函數(shù)列表,如果沒有在好到劫灶,在沿著 superClass ,尋找父類裸违,再從父類 methodLists 方法列表里面查詢,最終找到 SEL ,根據(jù) id 和 SEL 確認 IMP(指針函數(shù))本昏,再發(fā)送消息供汛。
  2. 如果向一個nil對象發(fā)送消息,首先在尋找對象的isa指針時就是0地址返回了涌穆,所以不會出現(xiàn)任何錯誤怔昨,也不會崩潰。
  3. 因為這個對象已經(jīng)被釋放了(引用計數(shù)為0了)宿稀,那么這個時候再去調(diào)用方法肯定是會Crash的朱监,這個時候對象就是一個野指針(指向僵尸對象(對象的引用計數(shù)為0,指針指向的內(nèi)存已經(jīng)不可用)的指針)了原叮,安全的做法是釋放后將對象重新置為nil赫编,使它成為一個空指針。
2. 一個objc對象的isa的指針指向什么奋隶,有什么作用擂送?

1、對象的isa指向類唯欣,類的isa指向元類(meta class)嘹吨,元類isa指向元類的根類。isa幫助一個對象找到它的方法
2境氢、是一個Class 類型的指針. 每個實例對象有個isa的指針,他指向對象的類蟀拷,而Class里也有個isa的指針, 指向meteClass(元類)。元類保存了類方法的列表萍聊。當類方法被調(diào)用時问芬,先會從本身查找類方法的實現(xiàn),如果沒有寿桨,元類會向他父類查找該方法此衅。同時注意的是:元類(meteClass)也是類,它也是對象亭螟。元類也有isa指針,它的isa指針最終指向的是一個根元類(root meteClass).根元類的isa指針指向本身挡鞍,這樣形成了一個封閉的內(nèi)循環(huán)

3. iOS分類中能否添加屬性,why预烙?

分類是只可以添加方法的墨微,不能直接添加屬性的,因為分類的結構體中沒有struct objc_ivar_list * _Nullable ivars這個數(shù)組扁掸。
如果要給分類添加屬性翘县,可以利用runtime最域,重寫getter、setter方法

4. ARC通過什么方式幫助開發(fā)者管理內(nèi)存炼蹦?

ARC 在代碼編譯時羡宙,自動的向代碼中插入retain和release,完成了對象的引用計算加減掐隐。
在運行時狗热,通過對weak對象的管理,避免了引用環(huán)虑省。runtime維護的weak對象列表匿刮。

5. 如何用GCD同步若干個異步調(diào)用?(如根據(jù)若干個url異步加載多張圖片探颈,然后在都下載完成后合成一張整圖

答案鏈接

6. block中使用self是否一定會造成循環(huán)引用熟丸?

block容易引起循環(huán)引用是因為在VC中聲明block,相當于VC擁有block伪节,然后在block中訪問self光羞,block又擁有self,所以會造成循環(huán)引用怀大。但是如果self沒有擁有block纱兑,在block中使用self就不會循環(huán)引用

7. BAD_ACCESS在什么情況下出現(xiàn)?如何調(diào)試BAD_ACCESS錯誤?

1??訪問了野指針化借,比如對一個已經(jīng)釋放的對象執(zhí)行了release潜慎、訪問已經(jīng)釋放對象的成員變量或者發(fā)消息,死循環(huán)蓖康。
2??如下方法都可行:
1铐炫、重寫object的respondsToSelector方法,找到出現(xiàn)EXEC_BAD_ACCESS前訪問的最后一個object
2蒜焊、設置全局斷點快速定位問題代碼所在行

3倒信、如下圖設置方法
image.png
8. dispatch_barrier_sync 和dispatch_barrier_async的區(qū)別

dispatch_barrier_sync 需要等待柵欄執(zhí)行完才會執(zhí)行柵欄后面的任務,而dispatch_barrier_async 無需等待柵欄執(zhí)行完,會繼續(xù)往下走(保留在隊列里)
原因:在同步柵欄時柵欄函數(shù)在主線程中執(zhí)行,而異步柵欄中開辟了子線程柵欄函數(shù)在子線程中執(zhí)行

9. 字符串為什么使用copy?能不能使用Strong?

這是一個安全性問題,比如聲明的一個NSString *str變量山涡,然后把一個NSMutableString * mStr變量的賦值給它了堤结,如果要求str跟著mStr變化,那么就用strong鸭丛;如果str不能跟著mStr一起變化,那就用copy唐责。而對于要把NSString類型的字符串賦值給str鳞溉,那兩都沒啥區(qū)別。不會影響安全性鼠哥,內(nèi)存管理也一樣

10. UITableView繼承于誰?如何做性能優(yōu)化?

1熟菲、UITableView繼承于UIScrollview看政,因此它默認支持垂直滾動(只支持垂直滾動)
2、性能優(yōu)化:cell復用抄罕、cell高度的計算允蚣、渲染、減少視圖的數(shù)目呆贿、減少多余的繪制操作嚷兔、不要給cell動態(tài)添加subView、異步化UI不要阻塞主線程等

11. 在做畫板時使用一直在DrawRect方法畫會造成內(nèi)存爆漲?如果是你你會怎么樣解決該問題?

1做入、drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
在此方法調(diào)用之前冒晰,CALayer需要創(chuàng)建一個空寄宿圖(有尺寸)和一個CoreGraphics 的CGContextRef(上下文),當繪制結束后竟块,Core Animation打包所有圖層和動畫屬性壶运,然后通過IPC(內(nèi)部處理通信)發(fā)送到渲染服務器進行顯示,同時上下文會被不斷渲染到屏幕上浪秘,直到下次調(diào)用setNeedsDisplay蒋情。
所以每次重繪都需要抹掉內(nèi)存重新分配,空寄宿圖的產(chǎn)生就消耗了大量內(nèi)存耸携,這也就是drawRect 內(nèi)存暴增原因棵癣。
2、1??用CGPath來定義想要繪制的圖形违帆,CAShapeLayer會自動渲染浙巫。它可以完美替代我們的直接使用Core Graphics繪制layer;
2??CAShapeLayer繼承自CALayer刷后,可以使用CALayer的所有屬性值的畴,CAShapeLayer是一個通過矢量圖形而不是bitmap來繪制的圖層子類;3??渲染快速尝胆,CAShapeLayer 使用了硬件加速丧裁,繪制同一圖形會比用 Core Graphics 快很多;4??高效使用內(nèi)存含衔,一個 CAShapeLayer 不需要像普通 CALayer 一樣創(chuàng)建一個contents寄宿圖形煎娇,所以無論有多大,都不會占用太多的內(nèi)存贪染;5??不會被圖層邊界剪裁掉缓呛;6??不會出現(xiàn)像素化;
總結:
CAShapeLayer屬于CoreAnimation框架杭隙,其動畫渲染直接提交到手機的GPU當中哟绊,相較于view的drawRect方法使用CPU渲染而言(實現(xiàn)drawRect消耗性能跟CoreGraphics 這個框架是基于CPU沒有關系),GPU圖像處理工作更多在硬件層面痰憎,效率極高票髓;
一個 CAShapeLayer 不需要像普通 CALayer 一樣創(chuàng)建一個寄宿圖形攀涵,所以無論有多大,都不會占用太多的內(nèi)存洽沟。
所以以故,關于繪圖,我們可以嘗試使用CAShapeLayer + UIBezierPath

12. 什么時候使用代理,什么時候使用Block,什么時候使用通知?

通知裆操,代理怒详,block都用于系統(tǒng)回調(diào)
代理
優(yōu)點:
1.代理語法清晰,可讀性高跷车,易于維護
2.它減少代碼耦合性棘利,使事件監(jiān)聽與事件處理分離
3.一個控制器可以實現(xiàn)多個代理,滿足自定義開發(fā)需求朽缴,靈活性較高
缺點:
1.實現(xiàn)代理的過程較繁瑣
2.跨層傳值時加大代碼的耦合性善玫,并且程序的層次結構也變得混亂
3.當多個對象同時傳值時不易區(qū)分,導致代理易用性大大降低
Block
優(yōu)點:
1.語法簡潔密强,代碼可讀性和維護性較高 茅郎;2. 配合GCD優(yōu)秀的解決多線程問題
缺點:
1.Block中得代碼將自動進行一次retain操作,容易造成內(nèi)存泄漏
2.Block內(nèi)默認引用為強引用或渤,容易造成循環(huán)應用
通知
優(yōu)點:
1.使用簡單系冗,代碼精簡
2.支持一對多,解決同時向多個對象監(jiān)聽的問題
3.傳值方便快捷薪鹦,context自帶攜帶相應的內(nèi)容
缺點:1.通知使用完畢后需要注銷掌敬,否則會造成意外崩潰
2.key不夠安全,編譯器不會檢測到是否被通知中心處理
3.調(diào)試時難以跟蹤
4.當使用者向通知中心發(fā)送通知的時候池磁,并不能獲得任何反饋信息
5.需要一個第三方的對象來做監(jiān)聽與被監(jiān)聽者的中介
注:delegate運行成本低奔害,block成本高
block出棧需要將使用的數(shù)據(jù)從棧內(nèi)存拷貝到堆內(nèi)存,當然對象的話就是加計數(shù)地熄,使用完或者block置 nil 后才消除华临;delegate只是保存了一個對象指針,直接回調(diào)端考,沒有額外消耗雅潭,相對C的函數(shù)指針,只做了一個查表的動作

13. 多個cell展示圖片圓形頭像時,如何處理優(yōu)化性能?

問題:
1却特、我們需要一個圓角的圖片扶供,但是使用 cornerRadius 切了個假圓角,實際上是把四周透明了裂明,操作了layer層诚欠。
2、有透明就有混合圖層漾岳。
3轰绵、有混合圖層,GPU 計算量就會變大尼荆。
4左腔、圖層固定還好,如果圖層一直在移動(cell 滾動)捅儒,那么就會出現(xiàn)離屏渲染液样。
所以使用核心繪圖 + 貝塞爾圓形切割 產(chǎn)生一張新真正切割過四個角的圖圖片就好了。渲染最慢的操作之一是混合(blending)巧还,混合操作由GPU來執(zhí)行鞭莽。提高性能的方法是減少混合操作的次數(shù)。優(yōu)化混合操作的關鍵點是在平衡CPU和GPU的負載麸祷。
拖慢幀率的原因其實都是Off-Screen Rendering(離屏渲染)的原因澎怒。離屏渲染是個好東西,但是頻繁發(fā)生離屏渲染是非常耗時的阶牍。

14. 離屏渲染

通常喷面,GPU 的渲染性能要比 CPU 高效很多,同時對系統(tǒng)的負載和消耗也更低一些走孽。
CPU離屏渲染:core graphics是cpu渲染
GPU離屏渲染:需要開辟新的緩沖區(qū)渲染惧辈,繪制的時候需要上下文切換。

15. coreData和FMDB的區(qū)別及用法?
CF9CED8C-4B12-4DAA-909E-5B5D319BD91D.png

1??FMDB:用OC封裝C語言SQLite3磕瓷,非蘋果官方盒齿,第三方;還是需要程序員編寫SQL語句
2??CoreData:用OC封裝C語言SQLite3,相對FMDB來說較重量級困食,蘋果官方;不需要程序員編寫SQL語句
3??CoreData會把一個對象整個存到數(shù)據(jù)庫边翁,而使用FMDB可以做到存儲一個對象的某個屬性

16. const常量與宏定義區(qū)別?

1.一般項目中盡量避免使用大量的宏定義,宏定義不會分配內(nèi)存陷舅,是代碼段的替換倒彰,而static const 修飾的常量 ,則只會開啟一份內(nèi)存空間莱睁,其使用效果和宏定義相同待讳,建議以后項目開發(fā)中定義常量時,多用 static const 來代替宏定義
2.const修飾字符串:一般const修改可變與不可變仰剿,就看const右邊修飾的是什么创淡,如:NSString * const name = @"JACK",則代表指針name不可變南吮,*name可變琳彩,若NSString const * name = @"JACK",則 *name不可變,指針name可變
3.const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型露乏;編譯器可以對前者進行類型安全檢查碧浊。而對后者只進行字符替換,沒有類型安全檢查瘟仿,并且在字符替換可能會產(chǎn)生意料不到的錯誤(邊際效應);宏定義是一個’編譯時’概念箱锐,const是’運行時’概念
4.宏定義可以通過#undef來使之前的宏定義失效,const常量定義后將在定義域內(nèi)永久有效
5.宏定義不能作為參數(shù)傳遞給函數(shù)劳较,const常量可以在函數(shù)的參數(shù)列表中出現(xiàn)

17. runloop的運行模式

主線程已經(jīng)自動創(chuàng)建了Runloop,子線程中需要手動創(chuàng)建之后開啟runloop才能保證線程不死驹止,定時器才能正常工作。RunLoop的5個類: CFRunLoopRef观蜗、CFRunLoopModeRef臊恋、CFRunLoopSourceRef、CFRunLoopTimerRef墓捻、CFRunLoopObserverRef抖仅。
在RunLoop中有多個運行模式,但RunLoop只能選擇一種模式運行
Mode里面至少要有一個Timer或Source
CFRunLoopModeRef代表RunLoop的運行模式
一個RunLoop包含若干個Mode毙替,每個Mode又包含若干個Source/Timer/Observer
每次RunLoop啟動時岸售,只能指定其中一個Mode,這個Mode被稱作CurrentMode
如果需要切換Mode厂画,只能退出Loop 凸丸,在重新指定一個Mode進入
這樣做主要是為了分割開不同組的Source/Timer/Observer,讓其互不影響

18. NSMutableArray和NSArray用什么修飾好袱院?

[答案鏈接]http://www.reibang.com/p/503ed56bbf1f

19. 什么情況下用assign屎慢,什么情況下用retain,什么情況下用copy忽洛?

這些關鍵字一般影響的是set方法:
assign:直接賦值腻惠,無retain操作;
retain:release舊值,retain新值;
copy:set方法會先release舊值欲虚,再copy一個新的對象集灌,reference count 為1。
assign 適用于基本數(shù)據(jù)類型如int,float,struct等值類型复哆,不適用于引用類型欣喧。因為值類型會被放入棧中,遵循先進后出原則梯找,由系統(tǒng)負責管理棧內(nèi)存唆阿。而引用類型會被放入堆中,需要我們自己手動管理內(nèi)存或通過ARC管理

20. 淺拷貝和深拷貝區(qū)別

淺拷貝:淺拷貝并不拷貝對象本身锈锤,只是對指向對象的指針進行拷貝
深拷貝:直接拷貝對象到內(nèi)存中一塊區(qū)域驯鳖,然后把新對象的指針指向這塊內(nèi)存
調(diào)用copy和mutableCopy方法的區(qū)別:
1闲询、非容器類對象:
非容器類不可變對象調(diào)用Copy方法其實只是把當前對象的指針指向了原對象的地址,而調(diào)用mutableCopy方法則是新分配了一塊內(nèi)存區(qū)域并把新對象的指針指向了這塊區(qū)域浅辙。對于可變對象來說調(diào)用Copy和MutableCopy方法都會重新分配一塊內(nèi)存扭弧。但是copy和mutableCopy的區(qū)別在于copy在復制對象的時候其實是返回了一個不可變對象,當調(diào)用方法改變對象的時候會崩潰摔握。
2寄狼、容器類對象:
可變對象不管調(diào)用Copy還是MutableCopy都是新分配一塊內(nèi)存。但是雖然重新分配了一塊內(nèi)存氨淌,對象里面的數(shù)據(jù)依然是指針復制,容器類對象伊磺,其元素對象始終是指針復制

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
禁止轉載盛正,如需轉載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末屑埋,一起剝皮案震驚了整個濱河市豪筝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摘能,老刑警劉巖续崖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異团搞,居然都是意外死亡严望,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門逻恐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來像吻,“玉大人,你說我怎么就攤上這事复隆〔Υ遥” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵挽拂,是天一觀的道長惭每。 經(jīng)常有香客問我,道長亏栈,這世上最難降的妖魔是什么台腥? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮仑扑,結果婚禮上览爵,老公的妹妹穿的比我還像新娘。我一直安慰自己镇饮,他們只是感情好蜓竹,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般俱济。 火紅的嫁衣襯著肌膚如雪嘶是。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天蛛碌,我揣著相機與錄音聂喇,去河邊找鬼。 笑死蔚携,一個胖子當著我的面吹牛希太,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酝蜒,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼誊辉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了亡脑?” 一聲冷哼從身側響起堕澄,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霉咨,沒想到半個月后蛙紫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡途戒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年坑傅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棺滞。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡裁蚁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出继准,到底是詐尸還是另有隱情枉证,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布移必,位于F島的核電站室谚,受9級特大地震影響,放射性物質發(fā)生泄漏崔泵。R本人自食惡果不足惜秒赤,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憎瘸。 院中可真熱鬧入篮,春花似錦、人聲如沸幌甘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至酥诽,卻和暖如春鞍泉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肮帐。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工咖驮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人训枢。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓托修,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肮砾。 傳聞我的和親對象是個殘疾皇子诀黍,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容