一、KVO內(nèi)部實(shí)現(xiàn)原理
- KVO是基于runtime機(jī)制實(shí)現(xiàn)的
- 當(dāng)某個(gè)類的對象第一次被觀察時(shí)湖员,系統(tǒng)就會在運(yùn)行期動態(tài)地創(chuàng)建該類的一個(gè)派生類,在這個(gè)派生類中重寫基類中任何被觀察屬性的setter 方法吱型。派生類在被重寫的 setter 方法實(shí)現(xiàn)真正的通知機(jī)制(Person->NSKVONotifying_Person)
二 、 是 否 可 以 把 比 較 耗 時(shí) 的 操 作 放 在NSNotificationCenter中
如果在異步線程發(fā)的通知,那么可以執(zhí)行比較耗時(shí)的操作弥锄;
如果在主線程發(fā)的通知沼侣,那么就不可以執(zhí)行比較耗時(shí)的操作
三祖能、Foundation對象與 Core Foundation對象有什么區(qū)別
1>Foundation對象是OC的,Core Foundation對象是C對象
2> 數(shù)據(jù)類型之間的轉(zhuǎn)換
· ARC:__bridge_retained蛾洛、__bridge_transfer
· 非ARC: __bridge
四养铸、不用中間變量,用兩種方法交換 A和 B的值
A=A + B
B=A - B
A=A - B
或者
A=A^B;
B=A^B;
A=A^B;
五、簡單描述下對單利模式設(shè)計(jì)的理解轧膘?
節(jié)省內(nèi)存資源钞螟,一個(gè)應(yīng)用就一個(gè)對象。
六谎碍、什么是動態(tài)鳞滨,舉例說明
在程序運(yùn)行過程才執(zhí)行的操作
七、runtime實(shí)現(xiàn)的機(jī)制是什么,怎么用蟆淀,一般用于干嘛. 你還能記得你所使用的相關(guān)的頭文件或者某些方法的名稱嗎拯啦?
運(yùn)行時(shí)機(jī)制澡匪,runtime庫里面包含了跟類、成員變量褒链、方法相關(guān)的API唁情,比如獲取類里面的所有成員變量,為類動態(tài)添加成員變量甫匹,動態(tài)改變類的方法實(shí)現(xiàn)荠瘪,為類動態(tài)添加新的方法等 需要導(dǎo)入<objc/message.h><objc/runtime.h> runtime,運(yùn)行時(shí)機(jī)制赛惩,它是一套C語言庫哀墓。 實(shí)際上我們編寫的所有OC代碼,最終都是轉(zhuǎn)成了runtime庫的東西喷兼,比如類轉(zhuǎn)成了runtime庫里面的結(jié)構(gòu)體等數(shù)據(jù)類型篮绰,方法轉(zhuǎn)成了runtime庫里面的C語言函數(shù),平時(shí)調(diào)方法都是轉(zhuǎn)成了objc_msgSend函數(shù)(所以說OC有個(gè)消息發(fā)送機(jī)制)因此季惯,可以說runtime是OC的底層實(shí)現(xiàn)吠各,是OC的幕后執(zhí)行者。有了runtime庫勉抓,能做什么事情呢贾漏?runtime庫里面包含了跟類、成員變量藕筋、方法相關(guān)的API纵散,比如獲取類里面的所有成員變量,為類動態(tài)添加成員變量隐圾,動態(tài)改變類的方法實(shí)現(xiàn)伍掀,為類動態(tài)添加新的方法等。因此暇藏,有了runtime蜜笤,想怎么改就怎么改
八、是否使用 Core Text或者 Core Image等盐碱?如果使用過把兔,請談?wù)勀闶褂?CoreText或者 CoreImage的體驗(yàn)。
CoreText
- 隨意修改文本的樣式
- 圖文混排(純C語言)
- 國外:Niumb
Core Image(濾鏡處理)
- 能調(diào)節(jié)圖片的各種屬性(對比度, 色溫, 色差等)
九瓮顽、NSNotification和 KVO的區(qū)別和用法是什么县好?什么時(shí)候應(yīng)該使用通知,什么時(shí)候應(yīng)該使用KVO趣倾,它們的實(shí)現(xiàn)上有什么區(qū)別嗎聘惦?如果用protocol和delegate(或者delegate的Array)來實(shí)現(xiàn)類似的功能可能嗎某饰?如果可能儒恋,會有什么潛在的問題善绎?如果不能,為什么诫尽?(雖然 protocol和 delegate這種東西面試已經(jīng)面爛了…)
NSNotification是通知模式在iOS的實(shí)現(xiàn)禀酱,KVO的全稱是鍵值觀察(Key-value observing),其是基于KVC(key-value coding)的,KVC是一個(gè)通過屬性名訪問屬性變量的機(jī)制牧嫉。例如將Module層的變化剂跟,通知到多個(gè)Controller對象時(shí),可以使用NSNotification酣藻;如果是只需要觀察某個(gè)對象的某個(gè)屬性曹洽,可以使用KVO。
對于委托模式辽剧,在設(shè)計(jì)模式中是對象適配器模式送淆,其是delegate是指向某個(gè)對象的,這是一對一的關(guān)系怕轿,而在通知模式中偷崩,往往是一對多的關(guān)系。委托模式撞羽,從技術(shù)上可以現(xiàn)在改變delegate指向的對象阐斜,但不建議這樣做,會讓人迷惑诀紊,如果一個(gè)delegate對象不斷改變谒出,指向不同的對象。
十邻奠、Block內(nèi)部的實(shí)現(xiàn)原理
Objective-C是對C語言的擴(kuò)展到推,block的實(shí)現(xiàn)是基于指針和函數(shù)指針
iOS - 揭露Block的內(nèi)部實(shí)現(xiàn)原理
十一、使用 protocol時(shí)惕澎,聲明一組可選擇實(shí)現(xiàn)與否的函數(shù)莉测,需要在聲明的前一行加上
@Optional
十二、怎樣防止指針的越界使用問題?
必須讓指針指向一個(gè)有效的內(nèi)存地址, 1唧喉、防止數(shù)組越界2捣卤、防止向一塊內(nèi)存中拷貝過多的內(nèi)容3、防止使用空指針4八孝、防止改變 const 修改的指針5董朝、防止改變指向靜態(tài)存儲區(qū)的內(nèi)容6、防止兩次釋放一個(gè)指針7干跛、防止使用野指針.
十三子姜、談?wù)?webView的作用
webview與運(yùn)維成本低, 更新幾乎不依賴App的版本
十四楼入、What is purpose of delegates? 代理的作用哥捕?
代理的目的是改變或傳遞控制鏈牧抽。允許一個(gè)類在某些特定時(shí)刻通知到其他類,而不需要獲取到那些類的指針遥赚⊙锸妫可以減少框架復(fù)雜度。 另外一點(diǎn)凫佛,代理可以理解為 java中的回調(diào)監(jiān)聽機(jī)制的一種類似
十五讲坎、What are mutable and immutable types in Objective C? obc中可修改和不可以修改類型。
可修改不可修改的集合類愧薛。這個(gè)我個(gè)人簡單理解就是可動態(tài)添加修改和不可動態(tài)添加修改一樣晨炕。比如 NSArray 和 NSMutableArray。前者在初始化后的內(nèi)存控件就是固定不可變的毫炉,后者可以添加等府瞄,可以動態(tài)申請新的內(nèi)存空間。
十六碘箍、When we call objective c is runtimelanguage what does it mean? 我們說的 obc是動態(tài)運(yùn)行時(shí)語言是什么意思遵馆?
多態(tài)。 主要是將數(shù)據(jù)類型的確定由編譯時(shí)丰榴,推遲到了運(yùn)行時(shí)货邓。這個(gè)問題其實(shí)淺涉及到兩個(gè)概念,運(yùn)行時(shí)和多態(tài)四濒。簡單來說换况,運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對象的類別,以及調(diào)用該類別對象指定方法盗蟆。 多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)戈二。意思就是假設(shè)生物類(life)都用有一個(gè)相同的方法-eat; 那人類屬于生物,豬也屬于生物喳资,都繼承了 life 后觉吭,實(shí)現(xiàn)各自的 eat,但是調(diào)用是我們只需調(diào)用各自的 eat 方法仆邓。也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了 eat 這個(gè)選擇器)鲜滩。 因此也可以說,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ).
十七节值、Polymorphism徙硅?關(guān)于多態(tài)性
多態(tài),子類指針可以賦值給父類搞疗。父類指針指向子類指針嗓蘑。
多態(tài)是具有表現(xiàn)多種形態(tài)的能力的特征,是為了避免在父類里大量重載引起代碼臃腫且難于維護(hù)。繼承是子類使用父類的方法桩皿,而多態(tài)則是父類使用子類中重寫父類的方法
十八條豌汇、obj-c有私有方法么?私有變量呢?
在 Objective-C 中沒有私有方法,只有靜態(tài)方法和實(shí)例方法业簿。但是可以用@private修飾私有變量。
十九條阳懂、什么是鍵-值,鍵路徑是什么梅尤?
模型的性質(zhì)是通過一個(gè)簡單的鍵(通常是個(gè)字符串)來指定的。視圖和控制器通過鍵來查找相應(yīng)的屬性值岩调。在一個(gè)給定的實(shí)體中巷燥,同一個(gè)屬性的所有值具有相同的數(shù)據(jù)類型。鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問對象屬性的機(jī)制号枕。鍵路徑是一個(gè)由用點(diǎn)作分隔符的鍵組成的字符串缰揪,用于指定一個(gè)連接在一起的對象性質(zhì)序列。第一個(gè)鍵的性質(zhì)是由先前的性質(zhì)決定的葱淳,接下來每個(gè)鍵的值也是相對于其前面的性質(zhì)钝腺。鍵路徑使您可以以獨(dú)立于模型實(shí)現(xiàn)的方式指定相關(guān)對象的性質(zhì)。通過鍵路徑赞厕,您可以指定對象圖中的一個(gè)任意深度的路徑艳狐,使其指向相關(guān)對象的特定屬性.
二十、c和 obj-c如何混用
1)obj-c 的編譯器處理后綴為 m 的文件時(shí)皿桑,可以識別 obj-c 和 c 的代碼毫目,處理 mm文件可以識別 obj-c,c,c++代碼,但 cpp 文件必須只能用 c/c++代碼诲侮,而且 cpp 文件include 的頭文件中镀虐,也不能出現(xiàn) obj- c 的代碼,因?yàn)?cpp 只是 cpp 2) 在 mm 文件中混用 cpp 直接使用即可沟绪,所以 obj-c 混 cpp 不是問題 3)在 cpp 中混用 obj- c其實(shí)就是使用 obj-c 編寫的模塊是我們想要的刮便。 如果模塊以類實(shí)現(xiàn),那么要按照cpp class 的標(biāo)準(zhǔn)寫類的定義绽慈,頭文件中不能出現(xiàn) obj-c 的東西诺核,包括#import cocoa的。實(shí)現(xiàn)文件中久信,即類的實(shí)現(xiàn)代碼中可以使用 obj-c 的東西窖杀,可以 import,只是后綴是 mm。 如果模塊以函數(shù)實(shí)現(xiàn)裙士,那么頭文件要按 c 的格式聲明函數(shù)入客,實(shí)現(xiàn)文件中,c++函數(shù)內(nèi)部可以用 obj-c,但后綴還是 mm 或 m桌硫。 總結(jié):只要 cpp 文件和 cpp include 的文件中不包含 obj-c 的東西就可以用了夭咬,cpp 混用 obj-c 的關(guān)鍵是使用接口,而不能直接使用實(shí)現(xiàn)代碼铆隘,實(shí)際上 cpp 混用的是 obj-c 編譯后的 o 文件卓舵,這個(gè)東西其實(shí)是無差別的,所以可以用膀钠。obj-c 的編譯器支持 cpp.
二十一掏湾、淺拷貝和深拷貝區(qū)別是什么
在有指針的情況下,淺拷貝只是增加了一個(gè)指針指向已經(jīng)存在的內(nèi)存肿嘲,而深拷貝就是增加一個(gè)指針并且申請一個(gè)新的內(nèi)存融击,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存,采用深拷貝的情況下雳窟,釋放內(nèi)存的時(shí)候就不會出現(xiàn)在淺拷貝時(shí)重復(fù)釋放同一內(nèi)存的錯(cuò)誤
二十二尊浪、Object-C有多繼承嗎?沒有的話用什么代替封救?cocoa 中所有的類都是 NSObject 的子類
Object-C沒有多繼承
多繼承在這里是用 protocol 委托代理 來實(shí)現(xiàn)的拇涤。不用去考慮繁瑣的多繼承 ,虛基類的概念.ood 的多態(tài)特性 在 obj-c 中通過委托來實(shí)現(xiàn).
二十二、在 Xcode中誉结,需要編譯混合 Objective-C和 C++的源碼文件工育,需要將文件格式的后綴改為()
.mm
二十三、在 Objective-C聲明一個(gè)類所要用到的編譯指令是 ()
@interface someClass
二十四搓彻、使用 Xcode創(chuàng)建工程時(shí)如绸,支持同時(shí)創(chuàng)建的版本管理庫是
git