iOS 2022面試題目

面試必備:(菜鳥的面試所得怒坯,如有錯(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原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末连茧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巍糯,更是在濱河造成了極大的恐慌啸驯,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祟峦,死亡現(xiàn)場(chǎng)離奇詭異罚斗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宅楞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門针姿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袱吆,“玉大人,你說我怎么就攤上這事距淫〗嗜蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵榕暇,是天一觀的道長(zhǎng)蓬衡。 經(jīng)常有香客問我,道長(zhǎng)拐揭,這世上最難降的妖魔是什么撤蟆? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮堂污,結(jié)果婚禮上家肯,老公的妹妹穿的比我還像新娘。我一直安慰自己盟猖,他們只是感情好讨衣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著式镐,像睡著了一般反镇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娘汞,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天歹茶,我揣著相機(jī)與錄音,去河邊找鬼你弦。 笑死惊豺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的禽作。 我是一名探鬼主播尸昧,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旷偿!你這毒婦竟也來了烹俗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤萍程,失蹤者是張志新(化名)和其女友劉穎幢妄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尘喝,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磁浇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朽褪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片置吓。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡无虚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衍锚,到底是詐尸還是另有隱情友题,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布戴质,位于F島的核電站度宦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏告匠。R本人自食惡果不足惜戈抄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望后专。 院中可真熱鬧划鸽,春花似錦、人聲如沸戚哎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽型凳。三九已至丈冬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甘畅,已是汗流浹背埂蕊。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疏唾,地道東北人粒梦。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荸实,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缴淋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容