面試題集錦
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
三. 設(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ò)字符串間接訪(fǎng)問(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ī)聞澗€(xiàn)的成員變量奏窑,如果有导披,則直接給成員變量屬性賦值。
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)
六. 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 混編
- OC引用Swift常見(jiàn)問(wèn)題
@objc
4. 持續(xù)化存儲(chǔ)
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)槭莗listKeychain(鑰匙串)
在Capabilities 中打開(kāi)Keychain
引入Security 庫(kù)
OSStatus SecItem 類(lèi)增刪改查文件沙盒 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];
- 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);
- 歸檔 (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è)文件中。
- 數(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