面試必備:(菜鳥的面試所得怒坯,如有錯(cuò)誤炫狱,歡迎指正修改)
1.MRC和ARC
MRC:手動(dòng)內(nèi)存管理,誰創(chuàng)建誰釋放剔猿,每一個(gè)new视译,alloc,retain都會(huì)使引用計(jì)數(shù)+1归敬,而relase會(huì)使引用計(jì)數(shù)-1酷含,每當(dāng)使用完一個(gè)對(duì)象的時(shí)候都需要relase釋放掉鄙早,或者加入自動(dòng)釋放池中,在適當(dāng)?shù)臅r(shí)候會(huì)釋放掉
ARC:iOS運(yùn)行的時(shí)候會(huì)吧iOS代碼轉(zhuǎn)化為匯編語言椅亚,在轉(zhuǎn)化的過程中iOS會(huì)自動(dòng)檢測(cè)該對(duì)象是否已經(jīng)使用完限番,會(huì)在適當(dāng)?shù)奈恢锰砑觬elase釋放對(duì)象
2.RunLoop,多線程
RunLoop是與線程相關(guān)的基礎(chǔ)架構(gòu)中的一部分呀舔,它是一個(gè)處理事件的循環(huán)弥虐,RunLoop的目的是在線程需要處理事件的時(shí)候線程是活躍的,在線程不需要處理的時(shí)候線程會(huì)進(jìn)入休眠
3.HTTP
HTTP是一個(gè)用于前后端通訊的超文本傳輸協(xié)議媚赖,因特網(wǎng)需要使用HTTP協(xié)議去訪問后端數(shù)據(jù)庫霜瘪,是基于TCP的應(yīng)用層協(xié)議,HTTP包含請(qǐng)求報(bào)文和響應(yīng)報(bào)文省古,在請(qǐng)求報(bào)文中我們可以設(shè)置請(qǐng)求方式是POST粥庄,或者GET,PUT豺妓,DELETE,設(shè)置請(qǐng)求header布讹,body琳拭,host,鏈接方式描验,參數(shù)格式等等白嘁,在響應(yīng)報(bào)文我們可以得到狀態(tài)行,響應(yīng)頭部膘流,和響應(yīng)體
4.Block
Block是將函數(shù)及其執(zhí)行上下文封裝起來的對(duì)象絮缅,是一段代碼塊對(duì)象
5.Category和Extension
Category可以添加方法不可以添加屬性,但是可以通過RunTime的關(guān)聯(lián)對(duì)象方法通過key來關(guān)聯(lián)添加屬性呼股,在Category中重寫系統(tǒng)方法會(huì)先調(diào)用Category里的方法耕魄,如果該方法有實(shí)現(xiàn)就不會(huì)調(diào)用系統(tǒng)自己的方法,如果有一個(gè)類同時(shí)有兩個(gè)Category重寫了同一個(gè)方法彭谁,那么先編譯哪一個(gè)方法就會(huì)先調(diào)用哪一個(gè)方法吸奴,如果需要調(diào)整順序,可以在build Phases->Compile Source中調(diào)整順序
Extension可以為一個(gè)類添加私有的變量和方法
6.消息轉(zhuǎn)發(fā)機(jī)制
在一個(gè)對(duì)象調(diào)用一個(gè)方法的時(shí)候會(huì)先在方法這個(gè)類的方法列表中查找的這個(gè)方法的名字缠局,如果在本類每找到就會(huì)去父類中尋找则奥,一只找到NSObject類為止,如果還找不到就會(huì)調(diào)用一個(gè)doseNotRecoginzaSelector方法拋出異常狭园,但是在調(diào)用doseNotRecoginzaSelector方法之前還有三次補(bǔ)救的機(jī)會(huì)读处,這就是消息轉(zhuǎn)發(fā)機(jī)制
這三個(gè)機(jī)會(huì)分別是:
1.查詢動(dòng)態(tài)方法:
//這是添加的動(dòng)態(tài)方法
void dynamicAdditionMethodIMP(id self,SEL _cmd){
NSLog(@"dynamicAdditionMethodIMP");
}
+(BOOL)resolveClassMethod:(SEL)sel{
NSLog(@"resolveInstanceMethod: %@", NSStringFromSelector(sel));
if(sel ==@selector(appendString:)) {
class_addMethod([selfclass], sel, (IMP)dynamicAdditionMethodIMP,"v@:");
returnYES;
}
return[superresolveClassMethod:sel];
}
+(BOOL)resolveInstanceMethod:(SEL)sel{
NSLog(@"resolveInstanceMethod: %@", NSStringFromSelector(sel));
if(sel ==@selector(appendString:)) {
class_addMethod([selfclass], sel, (IMP)dynamicAdditionMethodIMP,"v@:");
returnYES;
}
return[super resolveInstanceMethod:sel];
}
2.消息快速轉(zhuǎn)發(fā)
//先判斷方法名,再返回一個(gè)可以接收這個(gè)方法的類
-(id)forwardingTargetForSelector:(SEL)aSelector{
if ([NSStringFromSelector(aSelector) isEqualToString:@"testFunction"]) {
return [BackupTestMessage new];
}
return [super forwardingTargetForSelector:aSelector];
}
3.Normal forwarding 常規(guī)轉(zhuǎn)發(fā)階段
-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
//如果返回為nil則進(jìn)行手動(dòng)創(chuàng)建簽名
if ([super methodSignatureForSelector:aSelector]==nil) {
NSMethodSignature * sign = [NSMethodSignature signatureWithObjCTypes:"v@:"];
return sign;
}
return [super methodSignatureForSelector:aSelector];
}
-(void)forwardInvocation:(NSInvocation *)anInvocation{
//創(chuàng)建備用對(duì)象
BackupTestMessage * backUp = [BackupTestMessage new];
SEL sel = anInvocation.selector;
//判斷備用對(duì)象是否可以響應(yīng)傳遞進(jìn)來等待響應(yīng)的SEL
if ([backUp respondsToSelector:sel]) {
[anInvocation invokeWithTarget:backUp];
}else{
// 如果備用對(duì)象不能響應(yīng) 則拋出異常
[self doesNotRecognizeSelector:sel];
}
}
這就是完整的消息轉(zhuǎn)發(fā)流程
7.runTime
iOS的RunTime特性主要體現(xiàn)在4個(gè)方面:
1.RunTime的反射機(jī)制唱矛,即通過類或者方法名的字符串獲得類或者方法對(duì)象
2.RunTime的消息發(fā)送機(jī)制罚舱,iOS代碼調(diào)用的方法的時(shí)候會(huì)轉(zhuǎn)化為objc_sendMsg的底層方法去調(diào)用方法俊戳,開發(fā)過程中使用objc_sendMsg方法調(diào)用方法可以調(diào)用方法所使用的時(shí)間因?yàn)椴恍枰D(zhuǎn)化了
3.RunTime方法交換機(jī)制,用自己寫的方法替換系統(tǒng)本身的方法馆匿,通常我們會(huì)為NSString抑胎,NSArray,NSDictory等容易出現(xiàn)為空渐北,或者越界阿逃,這種常見的崩潰,使用方法交換機(jī)制去解決數(shù)組越界赃蛛,字符串為空等問題所引發(fā)的崩潰
4.消息發(fā)送機(jī)制恃锉,即上面所說到的
8.KVO,KVC
KVC:
-(void)setValue:(nullable id)value forKey:(NSString *)key;
// 根據(jù)key取值
- (id)valueForKey:(NSString *)key;
// 為對(duì)象的屬性賦值(包含了setValue:forKey:的功能呕臂,并且還可以對(duì)對(duì)象內(nèi)的類的屬性進(jìn)行賦值)
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
// 根據(jù)keyPath取值
- (nullable id)valueForKeyPath:(NSString *)keyPath;
// 對(duì)模型一次性賦值破托,前提是必須聲明好所有對(duì)應(yīng)的屬性(key)
- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;
KVO:通過監(jiān)聽某個(gè)對(duì)象的值,當(dāng)該對(duì)象的值發(fā)生改變時(shí)對(duì)調(diào)用監(jiān)聽方法歧蒋,在方法里可以獲取到新的值和舊的值土砂,然后去進(jìn)行一下相應(yīng)的操作
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
9.循環(huán)引用
當(dāng)對(duì)象A持有對(duì)象B,對(duì)象B持有對(duì)象C谜洽,對(duì)象C又持有對(duì)象A的時(shí)候就會(huì)引發(fā)循環(huán)引用萝映,常見的循環(huán)引用有:Block,delegate阐虚,NSTime序臂,解決這三個(gè)循環(huán)循環(huán)引用的最好方法是用weak修飾,因?yàn)閣eak修飾過后的變量用完以后會(huì)自動(dòng)置空
10.測(cè)試的時(shí)候使用什么進(jìn)行測(cè)試
CXTest实束,CXUITest
11.iOS進(jìn)程之間的通訊有什么方式
剪切板奥秆,URL Scheme,APP Group, KeyChain,AirDrop,UIActivityViewController
12.UITableView優(yōu)化[(緩存高度咸灿,異步繪制构订,減少層級(jí),hide析显,避免離屏渲染)]
1.cell復(fù)用
2.cell高度提前算好并緩存
3.避免離屏渲染
4.不需要點(diǎn)擊的視圖盡量使用Layer
5.耗時(shí)的操作盡量使用多線程
6.盡量減少子視圖的數(shù)量
7.webview盡量用一部加載
8.避免cell的重新布局
9.盡量使用局部更新reloadSection
10.不使用透明視圖
11.不阻塞主線程
13.優(yōu)化啟動(dòng)時(shí)間
啟動(dòng)時(shí)間分為兩部分:per-main的時(shí)間和main()函數(shù)之后的時(shí)間
pre-main時(shí)間:即調(diào)用 main() 函數(shù)之前的加載時(shí)間鲫咽,在這段時(shí)間里系統(tǒng)會(huì)進(jìn)行加載動(dòng)態(tài)庫、注冊(cè) Objc 類等系統(tǒng)操作谷异。
main() 之后的時(shí)間:即從調(diào)用 main( ) 函數(shù)到看到第一個(gè)頁面之間的時(shí)間(從 main 函數(shù)開始到第一個(gè)頁面的 - viewDidAppear 被調(diào)用)分尸。
Xcode 中 Edit scheme -> Run -> Auguments 將環(huán)境變量 DYLD_PRINT_STATISTICS 設(shè)為 1):
可以打開設(shè)置,啟動(dòng)程序的時(shí)候會(huì)打印出pre-main所需要的時(shí)間歹嘹,
Total pre-main time: 866.86 milliseconds (100.0%)
dylib loading time: 328.28 milliseconds (37.8%)
rebase/binding time: 49.19 milliseconds (5.6%)
ObjC setup time: 62.85 milliseconds (7.2%)
initializer time: 426.38 milliseconds (49.1%)
slowest intializers :
libSystem.B.dylib : 7.52 milliseconds (0.8%)
libMainThreadChecker.dylib : 37.19 milliseconds (4.2%)
libglInterpose.dylib : 61.17 milliseconds (7.0%)
libMTLInterpose.dylib : 22.23 milliseconds (2.5%)
MyMoney : 392.50 milliseconds (45.2%)
一箩绍。減少dylib,移除一些不必要的dylib
二尺上。清理無用的類或者方法
三材蛛。didFinishLaunchingWithOptions方法里盡量減少操作圆到,可以放到后面執(zhí)行的放到啟動(dòng)以后再執(zhí)行,可以寫一個(gè)類專門處理啟動(dòng)后調(diào)用的方法
四卑吭。減少啟動(dòng)的時(shí)候新建的UIViewController數(shù)量
五芽淡。啟動(dòng)的時(shí)候創(chuàng)建的控制器盡量少使用xib或者storyboard
14.藍(lán)牙
15.支付
1.微信開放平臺(tái)申請(qǐng)app,獲得appkey和appscrent
2.填寫訂單信息豆赏,簽名挣菲,獲取訂單號(hào)(這一步盡量后臺(tái)做,前段只要調(diào)個(gè)接口)
3.通過訂單號(hào)重新簽名掷邦,(這一步也是后臺(tái)做)白胀,填寫PayReq,調(diào)起微信
4.支付后onResp方法會(huì)收到回調(diào)信息
16.TCP和UDP
TCP - UDP
1.基于連接與無連接抚岗;2.對(duì)系統(tǒng)資源的要求(TCP較多或杠,UDP少);3.UDP程序結(jié)構(gòu)較簡(jiǎn)單宣蔚;4.流模式與數(shù)據(jù)報(bào)模式 向抢;5.TCP保證數(shù)據(jù)正確性,UDP可能丟包件已,TCP保證數(shù)據(jù)順序笋额,UDP不保證
TCP:面向連接、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序)篷扩、用于傳輸大量數(shù)據(jù)(流模式)、速度慢茉盏,建立連接需要開銷較多(時(shí)間鉴未,系統(tǒng)資源)。
UDP:面向非連接鸠姨、傳輸不可靠铜秆、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)、速度快讶迁。
17.線程鎖
18.SDWebImage原理