前言:
最近公司項目不怎么忙, 閑暇時間把iOS 在面試中可能會遇到的問題整理了一番, 一部分題目是自己面試遇到的,一部分題目則是網(wǎng)上收錄的, 方便自己鞏固復習, 也分享給大家! 知識點比較多,比較雜,這里做了分類,下面是分類鏈接地址;
面試知識點整理 - 目錄:
iOS | 面試知識整理 - OC基礎(chǔ) (一)
iOS | 面試知識整理 - OC基礎(chǔ) (二)
iOS | 面試知識整理 - OC基礎(chǔ) (三)
iOS | 面試知識整理 - UI 相 關(guān) (四)
iOS | 面試知識整理 - 內(nèi)存管理 (五)
iOS | 面試知識整理 - 多 線 程 (六)
iOS | 面試知識整理 - 網(wǎng)絡(luò)相關(guān) (七)
iOS | 面試知識整理 - 數(shù)據(jù)持久化 (八)
iOS | 面試知識整理 - Swift基礎(chǔ) (九)
iOS | 面試知識整理 - 數(shù)據(jù)持久化(八)
1. iOS中數(shù)據(jù)持久化方案有哪些?
-
NSUserDefault
簡單數(shù)據(jù)快速讀寫 -
Property list
(屬性列表)文件存儲 -
Archiver
(歸檔) -
SQLite
本地數(shù)據(jù)庫 CoreData
2. 什么是序列化和反序列化,用來做什么
- 序列化- 把對象轉(zhuǎn)化為字節(jié)序列的過程
- 反序列- 化把直接序列恢復成對象
- 作用- 把對象寫到文件或者數(shù)據(jù)庫中,并且讀取出來
3. OC中實現(xiàn)復雜對象的存儲
- 遵循NSCoding協(xié)議,實現(xiàn)復雜對象的存儲,實現(xiàn)該協(xié)議后可以對其進行打包或者解包,轉(zhuǎn)化為NSDate
4. SQLite 數(shù)據(jù)存儲是怎么用?
- 添加SQLite動態(tài)庫:
- 導入主頭文件:#import <sqlite3.h>
- 利用C語言函數(shù)創(chuàng)建\打開數(shù)據(jù)庫,編寫SQL語句
5. CoreData是什么?
- CoreData是iOS5之后才出現(xiàn)的一個框架,本質(zhì)上是對SQLite的一個封裝,它提供了對象-關(guān)系映射(ORM)的功能,即能夠?qū)C對象轉(zhuǎn)化成數(shù)據(jù),保存在SQLite數(shù)據(jù)庫文件中,也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成OC對象,通過CoreData管理應(yīng)用程序的數(shù)據(jù)模型,可以極大程度減少需要編寫的代碼數(shù)量!
6. 簡單描述下客戶端的緩存機制?
- 緩存可以分為:內(nèi)存數(shù)據(jù)緩存、數(shù)據(jù)庫緩存、文件緩存
- 每次想獲取數(shù)據(jù)的時候
- 先檢測內(nèi)存中有無緩存
- 再檢測本地有無緩存(數(shù)據(jù)庫\文件)
- 最終發(fā)送網(wǎng)絡(luò)請求
- 將服務(wù)器返回的網(wǎng)絡(luò)數(shù)據(jù)進行緩存(內(nèi)存、數(shù)據(jù)庫、文件), 以便下次讀取
7. 什么是NSManagedObject模型?
NSManagedObjcet是NSObject的子類,Core Date的重要組成部分。是一個通用類,實現(xiàn)了Core Date模型層所需的基本功能,用戶可以通過NSManagedObjcet建立自己的數(shù)據(jù)模型。
8. 說一說你對SQLite的認識
- SQLite是目前主流的嵌入式關(guān)系型數(shù)據(jù)庫,其最主要的特點就是輕量級、跨平臺,當前很多嵌入式操作系統(tǒng)都將其作為數(shù)據(jù)庫首選。
9. 說一說你對FMDB的認識
- FMDB是一個處理數(shù)據(jù)存儲的第三方框架,框架是對sqlite的封裝,整個框架非常輕量級但又不失靈活性,而且更加面向?qū)ο蟆?/li>
- 我們知道直接使用libsqlite3進行數(shù)據(jù)庫操作其實是線程不安全的,如果遇到多個線程同時操作一個表的時候可能會發(fā)生意想不到的結(jié)果。為了解決這個問題建議在多線程中使用FMDatabaseQueue對象,相比FMDatabase而言,它是線程安全的。
- 將事務(wù)放到FMDB中去說并不是因為只有FMDB才支持事務(wù),而是因為FMDB將其封裝成了幾個方法來調(diào)用,不用自己寫對應(yīng)的sql而已。其實在在使用libsqlite3操作數(shù)據(jù)庫時也是原生支持事務(wù)的(因為這里的事務(wù)是基于數(shù)據(jù)庫的,F(xiàn)MDB還是使用的SQLite數(shù)據(jù)庫),只要在執(zhí)行sql語句前加上“begin transaction;”執(zhí)行完之后執(zhí)行“commit transaction;”或者“rollback transaction;”進行提交或回滾即可。另外在Core Data中大家也可以發(fā)現(xiàn),所有的增、刪、改操作之后必須調(diào)用上下文的保存方法,其實本身就提供了事務(wù)的支持,只要不調(diào)用保存方法,之前所有的操作是不會提交的。在FMDB中FMDatabase有beginTransaction、commit、rollback三個方法進行開啟事務(wù)、提交事務(wù)和回滾事務(wù)。
10. 什么是沙盒機制?
- 每個iOS程序都有一個獨立的文件系統(tǒng)(存儲空間),而且只能在對應(yīng)的文件系統(tǒng)中進行操作,此區(qū)域被稱為沙盒。應(yīng)用必須待在自己的沙盒里,其他應(yīng)用不能訪問該沙盒。
11. 沙盒目錄結(jié)構(gòu)是怎樣的?
沙盒結(jié)構(gòu)
- Documents:常用目錄,iCloud備份目錄,存放數(shù)據(jù),這里不能存緩存文件,否則上架不被通過
- Library
- Caches:存放體積大又不需要備份的數(shù)據(jù),SDWebImage緩存路徑就是這個
- Preference:設(shè)置目錄,iCloud會備份設(shè)置信息
- tmp:存放臨時文件,不會被備份,而且這個文件下的數(shù)據(jù)有可能隨時被清除的可能
12. 使用 NSUserDefaults 時,如何處理布爾的默認值?(比如返回 NO,不知道是真的 NO 還是沒有設(shè)置過)
- 如果使用
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
方法,來進行存儲,就可以獲取到正確的 bool 值 - 如果使用
- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
,需要在獲取到值后在轉(zhuǎn)為 bool類型
13. 代碼題目分析,打印結(jié)果是什么?
NSUserDefaults *userdefault = [NSUserDefaults standardUserDefaults];
BOOL flag = NO;
[userdefault setObject:@(flag) forKey:@"flag"];
if ([userdefault objectForKey:@"flag"]) {
BOOL eq = [userdefault objectForKey:@"flag"];
if (eq) {
NSLog(@"a");
}else{
NSLog(@"b");
}
}else{
BOOL eq = [userdefault objectForKey:@"flag"];
if (eq) {
NSLog(@"c");
}else{
NSLog(@"d");
}
}
打印結(jié)果 a
分析: 包裝成 oc 對象,OC對象有值,轉(zhuǎn) bool 都是 yes
11. 如果后期需要增加數(shù)據(jù)庫中的字段怎么實現(xiàn),如果不使用CoreData呢?
- 編寫SQL語句來操作原來表中的字段
- 增加表字段:ALTER TABLE 表名 ADD COLUMN 字段名 字段類型;
- 刪除表字段:ALTER TABLE 表名 DROP COLUMN 字段名;
- 修改表字段:ALTER TABLE 表名 RENAME COLUMN 舊字段名 TO 新字段名;
14.FMDB使用 線程與事務(wù)
- FMDatabaseQueue 使用該類保證線程安全,串行隊列
- 事物是一個并發(fā)控制的基本單元,所謂的事務(wù),它是一個操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個不可分割的工作單位。
15.xml 和 json 區(qū)別
XML的優(yōu)點
格式統(tǒng)一,符合標準; 容易與其他系統(tǒng)進行遠程交互,數(shù)據(jù)共享比較方便。XML的缺點:
XML文件龐大,文件格式復雜,傳輸占帶寬;服務(wù)器端和客戶端都需要花費大量代碼來解析XML,導致服務(wù)器端和客戶端代碼變得異常復雜且不易維護;客戶端不同瀏覽器之間解析XML的方式不一致,需要重復編寫很多代碼;服務(wù)器端和客戶端解析XML花費較多的資源和時間。JSON的優(yōu)點:
數(shù)據(jù)格式比較簡單,易于讀寫,格式都是壓縮的,占用帶寬小;易于解析,客戶端JavaScript可以簡單的通過eval()進行JSON數(shù)據(jù)的讀取;支持多種語言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服務(wù)器端語言,便于服務(wù)器端的解析;JSON的缺點:
沒有XML格式這么推廣的深入人心和喜用廣泛,沒有XML那么通用性;JSON格式目前在Web Service中推廣還屬于初級階段。
17.什么是事務(wù)?
- 作為單個邏輯工作單元執(zhí)行的一系列操作,而這些邏輯工作單元需要具有原子性,一致性,隔離性和持久性
- 是并發(fā)控制的基本單元。所謂的事務(wù),它是一個操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個不可分割的工作單元。例如,銀行轉(zhuǎn)賬工作:從一個賬號扣款并使另一個賬號增款,這兩個操作要么都執(zhí)行,要么都不執(zhí)行。所以,應(yīng)該把它們看成一個事務(wù)。
- 事務(wù)是一種機制,用于維護數(shù)據(jù)庫的完整性
18. 熟悉常用SQL語句
create database name
drop database name
alter table name add column col type
select * from table1 where col=value
select count as totalcount from table1
select sum(field1) as sumvalue from table1
'insert into table1 (field1,field2) values(value1,value2) '
delete from table1 where something
update table1 set field1=value1 where field1 like ’%value1%'
參考:http://www.cnblogs.com/acpe/p/4970765.html
19.當數(shù)據(jù)庫中的某項數(shù)據(jù)未 null 時候,通過FMDB獲取的數(shù)據(jù)為
[NSNull null]