# iOS面試題

  • 1、fmdb
    1>有三個(gè)主要的類
    1.FMDatabase – 表示一個(gè)單獨(dú)的SQLite數(shù)據(jù)庫。 用來執(zhí)行SQLite的命令。
    2.FMResultSet – 表示FMDatabase執(zhí)行查詢后結(jié)果集
    3.FMDatabaseQueue – 如果你想在多線程中執(zhí)行多個(gè)查詢或更新,你應(yīng)該使用該類。這是線程安全的。
    2>創(chuàng)建FMDatabase對(duì)象時(shí)參數(shù)為SQLite數(shù)據(jù)庫文件路徑。該路徑可以是以下三種之一:
    1..文件路徑。該文件路徑無需真實(shí)存,如果不存在會(huì)自動(dòng)創(chuàng)建。
    2..空字符串(@”")。表示會(huì)在臨時(shí)目錄創(chuàng)建一個(gè)空的數(shù)據(jù)庫,當(dāng)FMDatabase 鏈接關(guān)閉時(shí),文件也被刪除。
    3.NULL. 將創(chuàng)建一個(gè)內(nèi)在數(shù)據(jù)庫。同樣的,當(dāng)FMDatabase連接關(guān)閉時(shí),數(shù)據(jù)會(huì)被銷毀。
    3> 打開數(shù)據(jù)庫
    在和數(shù)據(jù)庫交互 之前,數(shù)據(jù)庫必須是打開的。如果資源或權(quán)限不足無法打開或創(chuàng)建數(shù)據(jù)庫,都會(huì)導(dǎo)致打開
    4>常用命令
    SELECT、CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE (等)
    只要不是以SELECT開頭的命令都是UPDATE命令。執(zhí)行更新返回一個(gè)BOOL值。YES表示執(zhí)行成功,否則表示有那些錯(cuò)誤 。你可以調(diào)用 -lastErrorMessage 和 -lastErrorCode方法來得到更多信息。
    5> 執(zhí)行查詢
    SELECT命令就是查詢,執(zhí)行查詢的方法是以 -excuteQuery開頭的。執(zhí)行查詢時(shí),如果成功返回FMResultSet對(duì)象, 錯(cuò)誤返回nil. 與執(zhí)行更新相當(dāng),支持使用 NSError**參數(shù)。同時(shí),你也可以使用 -lastErrorCode和-lastErrorMessage獲知錯(cuò)誤信息。
    6>結(jié)果參數(shù)
    FMResultSet 提供了很多方法來獲得所需的格式的值:
    intForColumn:
    longForColumn:
    longLongIntForColumn:
    boolForColumn:
    doubleForColumn:
    stringForColumn:
    dataForColumn:
    dataNoCopyForColumn:
    UTF8StringForColumnIndex:
    objectForColumn:

  • 2、添加表字段的sql語句怎么寫
    1、判斷表是否打開
    2、判斷表中是否存在當(dāng)前的一個(gè)或者多個(gè)字段
    3、如果不存在添加字段

    20150928181202620.jpeg

  • 3、面向?qū)ο蟮睦斫?br> 面向?qū)ο蟪绦蛟O(shè)計(jì)(英語:Object-oriented programming,縮寫:OOP)是種具有對(duì)象概念的程序編程典范,同時(shí)也是一種程序開發(fā)的抽象方針。面向?qū)ο笞罨A(chǔ)的概念就是「類」和「對(duì)象」,并將其作為程序的基本單元,并擁有「封裝」、「抽象」、「繼承」、「多態(tài)」的特性。
    面向?qū)ο缶幊棠軌蚋奖愕貙?shí)現(xiàn)一些通過面向?qū)ο蠓治鲈O(shè)計(jì)的需求,可以很方便將某些現(xiàn)實(shí)事物轉(zhuǎn)化成更簡(jiǎn)潔的代碼去實(shí)現(xiàn),

  • 4、oc多態(tài)的理解,
    多態(tài)是指子類可以替換父類,在運(yùn)行時(shí)調(diào)用子類的實(shí)現(xiàn),
    不同對(duì)象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。
    二、在Objective-C中如何實(shí)現(xiàn)多態(tài)

在Objective-C中是通過一個(gè)叫做selector的選取器實(shí)現(xiàn)的。在Objective-C中,selector有兩個(gè)意思, 當(dāng)用在給對(duì)象的源碼消息時(shí),用來指方法的名字。它也指那個(gè)在源碼編譯后代替方法名的唯一的標(biāo)識(shí)符。 編譯后的選擇器的類型是SEL有同樣名字的方法、也有同樣的選擇器。你可以使用選擇器來調(diào)用一個(gè)對(duì)象的方法。

選取器有以下特點(diǎn):

  • 所有同名的方法擁有同樣的選取器

  • 所有的選取器都是不一樣的

(1) SEL和@selector

選擇器的類型是 SEL。@selector指示符用來引用選擇器,返回類型是SEL。

例如:

SELresponseSEL;

responseSEL =@selector(loadDataForTableView:);

可以通過字符串來得到選取器,例如:

responseSEL =NSSelectorFromString(@"loadDataForTableView:");

也可以通過反向轉(zhuǎn)換,得到方法名,例如:

NSString*methodName =NSStringFromSelector(responseSEL);

(2) 方法和選取器

選取器確定的是方法名,而不是方法實(shí)現(xiàn)。這是多態(tài)性和動(dòng)態(tài)綁定的基礎(chǔ),它使得向不同類對(duì)象發(fā)送相同的消息成為現(xiàn)實(shí);否則,發(fā)送 消息和標(biāo)準(zhǔn)C中調(diào)用方法就沒有區(qū)別,也就不可能支持多態(tài)性和動(dòng)態(tài)綁定。

另外,同一個(gè)類的同名類方法和實(shí)例方法擁有相同的選取器。

(3) 方法返回值和@參數(shù)類型

消息機(jī)制通過選取器找到方法的返回值類型和參數(shù)類型,因此,動(dòng)態(tài)綁定(例:向id定義的對(duì)象發(fā)送消息)需要同名方法的實(shí)現(xiàn)擁有相 同返回值類型和相同的參數(shù)類型;否則,運(yùn)行時(shí)可能出現(xiàn)找不到對(duì)應(yīng)方法的錯(cuò)誤。

有一個(gè)例外,雖然同名灶方法和實(shí)例方法擁有相同的選取器,但是它們可以有不同的參數(shù)類型和返回值類型。

  • 5、oc的動(dòng)態(tài)特性
    OC的動(dòng)態(tài)特性表現(xiàn)為了三個(gè)方面:動(dòng)態(tài)類型、動(dòng)態(tài)綁定、動(dòng)態(tài)加載。之所以叫做動(dòng)態(tài),是因?yàn)楸仨毜竭\(yùn)行時(shí)(run time)才會(huì)做一些事情。
    1)動(dòng)態(tài)類型
    動(dòng)態(tài)類型,說簡(jiǎn)單點(diǎn)就是id類型。動(dòng)態(tài)類型是跟靜態(tài)類型相對(duì)的。像內(nèi)置的明確的基本類型都屬于靜態(tài)類型(int、NSString等)。靜態(tài)類型在編譯的時(shí)候就能被識(shí)別出來。所以,若程序發(fā)生了類型不對(duì)應(yīng),編譯器就會(huì)發(fā)出警告。而動(dòng)態(tài)類型就編譯器編譯的時(shí)候是不能被識(shí)別的,要等到運(yùn)行時(shí)(run time),即程序運(yùn)行的時(shí)候才會(huì)根據(jù)語境來識(shí)別。所以這里面就有兩個(gè)概念要分清:編譯時(shí)跟運(yùn)行時(shí)。

(2)動(dòng)態(tài)綁定
動(dòng)態(tài)綁定(dynamic binding)貌似比較難記憶,但事實(shí)上很簡(jiǎn)單,只需記住關(guān)鍵詞@selector/SEL即可。先來看看“函數(shù)”,對(duì)于其他一些靜態(tài)語言,比如c++,一般在編譯的時(shí)候就已經(jīng)將將要調(diào)用的函數(shù)的函數(shù)簽名都告訴編譯器了。靜態(tài)的,不能改變。而在OC中,其實(shí)是沒有函數(shù)的概念的,我們叫“消息機(jī)制”,所謂的函數(shù)調(diào)用就是給對(duì)象發(fā)送一條消息。這時(shí),動(dòng)態(tài)綁定的特性就來了。OC可以先跳過編譯,到運(yùn)行的時(shí)候才動(dòng)態(tài)地添加函數(shù)調(diào)用,在運(yùn)行時(shí)才決定要調(diào)用什么方法,需要傳什么參數(shù)進(jìn)去。這就是動(dòng)態(tài)綁定,要實(shí)現(xiàn)他就必須用SEL變量綁定一個(gè)方法。最終形成的這個(gè)SEL變量就代表一個(gè)方法的引用。這里要注意一點(diǎn):SEL并不是C里面的函數(shù)指針,雖然很像,但真心不是函數(shù)指針。SEL變量只是一個(gè)整數(shù),他是該方法的ID。以前的函數(shù)調(diào)用,是根據(jù)函數(shù)名,也就是字符串去查找函數(shù)體。但現(xiàn)在,我們是根據(jù)一個(gè)ID整數(shù)來查找方法,整數(shù)的查找字自然要比字符串的查找快得多!所以,動(dòng)態(tài)綁定的特定不僅方便,而且效率更高。

(3)動(dòng)態(tài)加載
根據(jù)需求加載所需要的資源,最基本就是不同機(jī)型的適配

  • 6、week的底層原理
    1> runtime維護(hù)了一個(gè)弱引用表,將所有弱引用obj的指針地址都保存在obj對(duì)應(yīng)的weak_entry_t中。
    2> 初始化時(shí),runtime會(huì)調(diào)用objc_initWeak函數(shù),初始化一個(gè)新的weak指針指向?qū)ο蟮刂诽砑右脮r(shí),objc_initweak函數(shù)會(huì)調(diào)用objc_storeWeak函數(shù),作用是更新指針指向,創(chuàng)建對(duì)應(yīng)的弱引用表。
    3> 釋放時(shí),通過dealloc函數(shù)逐層判斷,最終調(diào)用clearDeallocating函數(shù),首先根據(jù)對(duì)象地址獲取所有weak指針地址的數(shù)組,然后遍歷這個(gè)數(shù)組把對(duì)應(yīng)的數(shù)據(jù)清空置為nil 。同時(shí),將weak_entry_t移除出弱引用表weak_table。

當(dāng)我們對(duì)一個(gè)對(duì)象進(jìn)行弱引用時(shí),底層是通過runtime來支持的,在底層會(huì)調(diào)用runtime的objc_initWeak函數(shù)

  • 7、常用修飾符
    在MRC下常用修飾符:
    assign/ retain/ copy/ readwrite、readonly/ nonatomic、atomic 等。
    在ARC下常用修飾符:
    assign/ strong/ weak/ copy/ readwrite、readonly/ nonatomic、atomic 等。

  • 8、原子和非原子
    1> atmoic:原子屬性,為系統(tǒng)默認(rèn)的屬性,會(huì)為修飾的成員變量的setter方法自動(dòng)加鎖(自旋鎖),使得線程安全,但較為消耗資源,效率相對(duì)低些。是一種單寫多讀的多線程技術(shù),可能出現(xiàn)臟數(shù)據(jù)。
    2> nonatomic:非原子屬性,開發(fā)中最常用的屬性,不會(huì)為修飾的成員變量的setter方法加鎖,雖然線程不安全,但效率高
    3> 在原子性中,最為核心的機(jī)制,便是鎖的機(jī)制。通過鎖的機(jī)制,可以保證線程的安全性,保證成員變量的安全性,這是我們選擇才不采用原子性最主要考慮的方面

  • 9、內(nèi)存的劃分


    image.png
  • 10、內(nèi)存管理
    MRC:Manual Reference Counting 手動(dòng)引用計(jì)數(shù)器,需要我們手動(dòng)管理對(duì)象引用計(jì)數(shù)器的值
    ARC:Autimatic Reference Counting 自動(dòng)引用計(jì)數(shù)器,系統(tǒng)自動(dòng)的改變對(duì)象引用計(jì)數(shù)器的值(iOS5之后),ARC是基于MRC的
    新創(chuàng)建一個(gè)對(duì)象,這個(gè)對(duì)象的引用計(jì)數(shù)器的值為1,有對(duì)象的創(chuàng)建,就需要匹配一個(gè)release,是誰來負(fù)責(zé)retain的,誰就要負(fù)責(zé)release,使用的時(shí)候retain,不是用的時(shí)候releaseretain的次數(shù)要和release次數(shù)想匹配,有加有減,做到平衡

參考文章:
FMDB數(shù)據(jù)庫升級(jí)增加表字段
iOS 多態(tài)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 把網(wǎng)上的一些結(jié)合自己面試時(shí)遇到的面試題總結(jié)了一下,以后有新的還會(huì)再加進(jìn)來。 1. OC 的理解與特性 OC 作為一...
    AlaricMurray閱讀 2,657評(píng)論 0 20
  • 一 基礎(chǔ)知識(shí)1.如何令自己所寫的對(duì)象具有拷貝功能? 目的 想讓自己創(chuàng)建的類具有copy方法 第一個(gè)返回不可變類型 ...
    王家小雷閱讀 1,554評(píng)論 0 6
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,565評(píng)論 0 35
  • 基礎(chǔ) 1. 為什么說Objective-C是一門動(dòng)態(tài)的語言? 2. 講一下MVC和MVVM,MVP? 3. 為...
    波妞和醬豆子閱讀 3,514評(píng)論 0 46
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,511評(píng)論 2 7

友情鏈接更多精彩內(nèi)容