知不足者好學纱皆,恥下問者自滿湾趾。-林逋《省心錄》
1、iOS中常用的數據存儲方式有哪些派草?
數據存儲有四種方案:NSUserdefaults搀缠、KeyChain、file近迁、DB
其中艺普,File包括:plist文件、Archive(歸檔)
DB包括:SQLite(常用FMDB鉴竭、微信團隊WCDB)歧譬、CoreData
2、iOS的沙盒目錄結構是怎樣的搏存?
沙盒結構:
1). Application:存放程序源文件瑰步,上架前經過數字簽名,上架后不可修改璧眠。
2). Documents:常用目錄缩焦,iCloud備份目錄,存放數據责静。(這里不能存緩存文件袁滥,否則上架不被通過)
3). Library:
Caches:存放體積大又不需要備份的數據。(常用的緩存路徑)
Preference:設置目錄灾螃,iCloud會備份設置信息题翻。
4). tmp:存放臨時文件,不會被備份睦焕,而且這個文件下的數據有可能隨時被清除的可能藐握。
3、iOS多線程技術有哪幾種方式垃喊?
常用:NSThread(OC)猾普、GCD(C語言)、NSOperation(OC)
不常用:pThread(C語言)本谜,pThread的全稱是POSIX threads初家,是線程的 POSIX 標準。
4乌助、GCD 與 NSOperation 的區(qū)別
GCD 和 NSOperation 都是用于實現多線程:
GCD 基于C語言的底層API溜在,GCD主要與block結合使用,代碼簡潔高效他托。
NSOperation 屬于Objective-C類掖肋,是基于GCD更高一層的封裝。復雜任務一般用NSOperation實現赏参。
5志笼、寫出使用GCD方式從子線程回到主線程的方法代碼
dispatch_sync(dispatch_get_main_queue(), ^{ });
6沿盅、如何用GCD同步若干個異步調用?(如根據若干個url異步加載多張圖片纫溃,然后在都下載完成后合成一張整圖)
// 使用Dispatch Group追加block到Global Group Queue,這些block如果全部執(zhí)行完畢腰涧,就會執(zhí)行Main Dispatch Queue中的結束處理的block。
// 創(chuàng)建隊列組
dispatch_group_t group = dispatch_group_create();
// 獲取全局并發(fā)隊列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, queue, ^{ /*加載圖片1 */ });
dispatch_group_async(group, queue, ^{ /*加載圖片2 */ });
dispatch_group_async(group, queue, ^{ /*加載圖片3 */ });
// 當并發(fā)隊列組中的任務執(zhí)行完畢后才會執(zhí)行這里的代碼
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 合并圖片
});
7紊浩、dispatch_barrier_async(柵欄函數)的作用是什么窖铡?
函數定義:dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
作用:
1.在它前面的任務執(zhí)行結束后它才執(zhí)行,它后面的任務要等它執(zhí)行完成后才會開始執(zhí)行坊谁。
2.避免數據競爭
// 1.創(chuàng)建并發(fā)隊列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
// 2.向隊列中添加任務
dispatch_async(queue, ^{ // 1.2是并行的
NSLog(@"任務1, %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任務2, %@",[NSThread currentThread]);
});
dispatch_barrier_async(queue, ^{
NSLog(@"任務 barrier, %@", [NSThread currentThread]);
});
dispatch_async(queue, ^{ // 這兩個是同時執(zhí)行的
NSLog(@"任務3, %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任務4, %@",[NSThread currentThread]);
});
// 輸出結果: 任務1 任務2 ——》 任務 barrier ——》任務3 任務4
// 其中的任務1與任務2费彼,任務3與任務4 由于是并行處理先后順序不定。
8呜袁、以下代碼運行結果如何敌买?
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}
// 只輸出:1。(主線程死鎖)
//死鎖原因
//1:dispatch_sync 在等待 block 語句執(zhí)行完成阶界,而 block 語句需要在主線程里執(zhí)行,所以dispatch_sync如果在主線程調用就會造成死鎖
//2:dispatch_sync 是同步的聋庵,本身就會阻塞當前線程膘融,即主線程。而又往主線程里塞進去一個 block祭玉,所以就會發(fā)生死鎖氧映。
9、OC中創(chuàng)建線程的方法是什么脱货?如果在主線程中執(zhí)行代碼岛都,方法是什么?
// 創(chuàng)建線程的方法
- [NSThread detachNewThreadSelector:nil toTarget:nil withObject:nil]
- [self performSelectorInBackground:nil withObject:nil];
- [[NSThread alloc] initWithTarget:nil selector:nil object:nil];
- dispatch_async(dispatch_get_global_queue(0, 0), ^{});
- [[NSOperationQueue new] addOperation:nil];
// 主線程中執(zhí)行代碼的方法
- [self performSelectorOnMainThread:nil withObject:nil waitUntilDone:YES];
- dispatch_async(dispatch_get_main_queue(), ^{});
- [[NSOperationQueue mainQueue] addOperation:nil];