iOS 面試題及答案

面試題集錦

iOS面試題及答案1
iOS面試題及答案2
iOS進(jìn)階面試題及答案3

一. CoreAnimation 相關(guān)

CABasicAnimation 資料
CoreAnimation(核心動(dòng)畫(huà))概述

iOS面試題及答案2.5
NStimer準(zhǔn)嗎?談?wù)勀愕目捶??如果不?zhǔn)該怎樣實(shí)現(xiàn)一個(gè)精確的NSTimer?

動(dòng)畫(huà)定時(shí)器——CADisplayLink

CoreGraphics(核心圖形)

它是iOS的核心圖形庫(kù),包含Quartz2D繪圖API接口,常用的是point,size,rect等這些圖形,都定義在這個(gè)框架中,類(lèi)名以CG開(kāi)頭的都屬于CoreGraphics框架,它提供的都是C語(yǔ)言函數(shù)接口,是可以在iOS和mac OS 通用的

QuartzCore

Quartz是位于Mac OS X的Drawin核心之上的繪圖層,這個(gè)框架感覺(jué)不是很清晰,但是看頭文件可以發(fā)現(xiàn),它就是CoreAnimation,這個(gè)框架頭文件只包含了

二. 第三方庫(kù)

SDWebImage

Github詳細(xì)資料
緩存策略

AFNetworking/ Alamorefire

Github詳細(xì)資料

三. 設(shè)計(jì)模式

1. MVC
2. MVVM
3. 單例

OC:

@implementation Singleton
    +(Singleton *)shared{
        static Singleton* instance = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [Singleton new];
        });
        return instance;
    }

+(id) allocWithZone:(struct _NSZone *)zone
{
    return [Singleton shareInstance] ;
}

-(id) copyWithZone:(NSZone *)zone
{
    return [Singleton shareInstance] ;
}

-(id) mutablecopyWithZone:(NSZone *)zone
{
    return [Singleton shareInstance] ;
}

Swift:

Class Singleton {
    static let shared = Singleton()
    private init() { }
}
4. 代理
5. 工廠模式

四. 消息傳遞

KVO

KVO(key-Value-Observing):鍵值觀察機(jī)制 他提供了觀察某一屬性變化的方法,極大的簡(jiǎn)化了代碼。基于runtime機(jī)制實(shí)現(xiàn)。
KVO只能被KVC觸發(fā),包括使用setValue:forKey:方法和點(diǎn)語(yǔ)法。

// 通過(guò)下方方法為屬性添加KVO觀察
- (void)addObserver:(NSObject *)observer
                  forKeyPath:(NSString *)keyPath
                  options:(NSKeyValueObservingOptions)options
                  context:(nullable void *)context;
// 當(dāng)被觀察的屬性發(fā)送變化時(shí),會(huì)自動(dòng)觸發(fā)下方方法                   
- (void)observeValueForKeyPath:(NSString *)keyPath
                           ofObject:(id)object
                               change:(NSDictionary *)change
                              context:(void *)context{}

KVC 和 KVO 的 keyPath 可以是屬性、實(shí)例變量、成員變量。

KVC

KVC(Key-Value-Coding):鍵值編碼 是一種通過(guò)字符串間接訪問(wèn)對(duì)象的方式(即給屬性賦值)
舉例說(shuō)明:

stu.name = @"張三" // 點(diǎn)語(yǔ)法給屬性賦值
[stu setValue:@"張三" forKey:@"name"]; // 通過(guò)字符串使用KVC方式給屬性賦值
stu1.nameLabel.text = @"張三";
[stu1 setValue:@"張三" forKey:@"nameLabel.text"]; // 跨層賦值

當(dāng)一個(gè)對(duì)象調(diào)用setValue方法時(shí),方法內(nèi)部會(huì)做以下操作:
1). 檢查是否存在相應(yīng)的key的set方法,如果存在,就調(diào)用set方法。
2). 如果set方法不存在,就會(huì)查找與key相同名稱(chēng)并且?guī)聞澗€的成員變量,如果有,則直接給成員變量屬性賦值。
3). 如果沒(méi)有找到_key,就會(huì)查找相同名稱(chēng)的屬性key,如果有就直接賦值。
4). 如果還沒(méi)有找到,則調(diào)用valueForUndefinedKey:和setValue:forUndefinedKey:方法。
這些方法的默認(rèn)實(shí)現(xiàn)都是拋出異常,我們可以根據(jù)需要重寫(xiě)它們。

通知

五. HTTP協(xié)議相關(guān)

詳細(xì)基礎(chǔ)資料

三次握手

四次握手

六. WKWebView相關(guān)

1. 緩存
2. Cookie

七. 其它

1. ViewController生命周期
1. initWithCoder:通過(guò)nib文件初始化時(shí)觸發(fā)。
2. awakeFromNib:nib文件被加載的時(shí)候,會(huì)發(fā)生一個(gè)awakeFromNib的消息到nib文件中的每個(gè)對(duì)象。      
3. loadView:開(kāi)始加載視圖控制器自帶的view。
4. viewDidLoad:視圖控制器的view被加載完成。  
5. viewWillAppear:視圖控制器的view將要顯示在window上。
6. updateViewConstraints:視圖控制器的view開(kāi)始更新AutoLayout約束。
7. viewWillLayoutSubviews:視圖控制器的view將要更新內(nèi)容視圖的位置。
8. viewDidLayoutSubviews:視圖控制器的view已經(jīng)更新視圖的位置。
9. viewDidAppear:視圖控制器的view已經(jīng)展示到window上。 
10. viewWillDisappear:視圖控制器的view將要從window上消失。
11. viewDidDisappear:視圖控制器的view已經(jīng)從window上消失。
2. 閉包的聲明

屬性聲明

void(^propertyName)(void);

函數(shù)聲明

- (void)function: callback: (ReturnTypeName(^)(TypeName *))handler;
3. Swift OC 混編
  1. OC引用Swift常見(jiàn)問(wèn)題
    @objc
4. 持續(xù)化存儲(chǔ)
  1. NSUserDefaults (偏好設(shè)置Preference) Preferences
    NSUserDefaults適合存儲(chǔ)輕量級(jí)的本地?cái)?shù)據(jù),支持的數(shù)據(jù)類(lèi)型有:NSNumbe (NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL,NSData
    NSUserDefault 本地保存的位置是Library/Preferences 這個(gè)目錄下的 plist 文件。
    使用偏好設(shè)置對(duì)數(shù)據(jù)進(jìn)行保存之后, 它保存到系統(tǒng)的時(shí)間是不確定的,會(huì)在將來(lái)某一時(shí)間點(diǎn)自動(dòng)將數(shù)據(jù)保存到Preferences文件夾下面,如果需要即刻將數(shù)據(jù)存儲(chǔ),可以使用[defaults synchronize]; 不可用自定義 因?yàn)槭莗list

  2. Keychain(鑰匙串)
    在Capabilities 中打開(kāi)Keychain
    引入Security 庫(kù)
    OSStatus SecItem 類(lèi)增刪改查

  3. 文件沙盒 Documents等
    主要存儲(chǔ)非機(jī)密數(shù)據(jù),大的數(shù)據(jù),如圖片。

存文件的操作步驟如下:
(1). 獲得文件即將保存的路徑
方法一:

NSArray *documentPaths = 
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  
NSUserDomainMask,YES);
NSString *ourDocumentPath =[documentPaths objectAtIndex:0];

方法二:

NSString *sandboxPath = NSHomeDirectory();
NSString *documentPath = [sandboxPath
stringByAppendingPathComponent:@"Documents"];

(2). 生成在該路徑下的文件

NSString *FileName=[documentDirectory stringByAppendingPathComponent:fileName];//fileName就是保存文件的文件名 

(3). 往文件中寫(xiě)入數(shù)據(jù)

[data writeToFile:FileName atomically:YES];//將NSData類(lèi)型對(duì)象data寫(xiě)入文件,文件名為FileName

從沙盒中取出文件:
取就比較簡(jiǎn)單,只需下面一行代碼!

NSData data=[NSData dataWithContentsOfFile:FileName options:0 error:NULL];
  1. plist存儲(chǔ) Documents
    即屬性列表文件,全名是Property List,這種文件的擴(kuò)展名為.plist,因此,通常被叫做plist文件。它是一種用來(lái)存儲(chǔ)串行化后的對(duì)象的文件,用于存儲(chǔ)程序中經(jīng)常用到且數(shù)據(jù)量小而不經(jīng)常改動(dòng)的數(shù)據(jù)。
    可以存儲(chǔ)的類(lèi)型:NSNumber,NSString,NSDate,NSData ,NSArray,NSDictionary,BOOL.
    不支持自定義對(duì)象的存儲(chǔ).

NSArray *sandBoxPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [sandBoxPath objectAtIndex:0];
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"myTestPlist.plist"];
NSLog(@"%@",plistPath);

  1. 歸檔 (NSKeyedArchiver) Cache
    歸檔在iOS中是另一種形式的序列化,只要遵循了NSCoding協(xié)議的對(duì)象都可以通過(guò)它實(shí)現(xiàn)序列化。由于決大多數(shù)支持存儲(chǔ)數(shù)據(jù)的Foundation和Cocoa Touch類(lèi)都遵循了NSCoding協(xié)議,因此,對(duì)于大多數(shù)類(lèi)來(lái)說(shuō),歸檔相對(duì)而言還是比較容易實(shí)現(xiàn)的。
    對(duì)象歸檔后將得到一個(gè)后綴為.archive的文件,數(shù)據(jù)就保存在了這個(gè)文件中。
  1. 數(shù)據(jù)庫(kù)
    SQLite (CoreData FMDB)
    Realm
路徑 保存數(shù)據(jù)特點(diǎn) iTunes是否同步
Document 適合存儲(chǔ)重要的數(shù)據(jù) 同步
Library/Caches 體積大,不需要備份 不同步
Library/Preferences 應(yīng)用的設(shè)置信息 同步
tmp 臨時(shí)文件 不同步

簡(jiǎn)介
優(yōu)缺點(diǎn)及選擇
文件目錄簡(jiǎn)介

5. UITableView初始化過(guò)程
1:詢(xún)問(wèn)分區(qū)個(gè)數(shù) numberOfSection
2:詢(xún)問(wèn)每個(gè)分區(qū)的頁(yè)眉和頁(yè)腳的預(yù)估高度 estimatedSectionHeaderHeight/estimatedSectionFooterHeight
3:詢(xún)問(wèn)每個(gè)分區(qū)cell的個(gè)數(shù) numberOfRows
4:詢(xún)問(wèn)每個(gè)分區(qū)cell的預(yù)估高度 estimatedRowHeight
5:詢(xún)問(wèn)每個(gè)分區(qū)cell的真實(shí)高度 rowHeight
6:詢(xún)問(wèn)每個(gè)分區(qū)cell的邊距、樣式、編輯狀態(tài)
7:詢(xún)問(wèn)每個(gè)分區(qū)頁(yè)腳的真實(shí)高度 heightForFooter
8:詢(xún)問(wèn)每個(gè)分區(qū)的cell(自定義cell)cellForRow
9:調(diào)用cell即將顯示的方法 cellWillDisplay

10:詢(xún)問(wèn)每個(gè)分區(qū)頁(yè)眉的真實(shí)高度 heightForHeader
11:詢(xún)問(wèn)每個(gè)分區(qū)頁(yè)眉(自定義UIView)viewForSectionHeader
12:調(diào)用每個(gè)分區(qū)頁(yè)眉即將出現(xiàn)的方法 sectionHeaderWillDisplay
13:詢(xún)問(wèn)每個(gè)分區(qū)頁(yè)腳(自定義UIView)viewForSectionFooter
14:調(diào)用每個(gè)分區(qū)頁(yè)腳即將出現(xiàn)的方法 sectionFooterWillDisplay

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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