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ù)想匹配,有加有減,做到平衡
