面試題

得物

KVO willchangevalue什么時候調(diào)用

鍵值觀察通知依賴于 NSObject 的兩個方法: willChangeValueForKey: 和 didChangevlueForKey:;在一個被觀察屬性發(fā)生改變之前纠吴, willChangeValueForKey: 一定會被調(diào)用豁跑,這就 會記錄舊的值。而當改變發(fā)生后睬澡,didChangeValueForKey: 會被調(diào)用,繼而 observeValueForKey:ofObject:change:context: 也會被調(diào)用眠蚂。

CocoPod install和update有什么區(qū)別

使用pod update PODNAME可以去更新一個庫的指定版本(檢查相應的庫是否存在更新的版本煞聪,并且更新),相對應的,使用pod install將不會更新那些已經(jīng)下載安裝了的庫逝慧。
當你在Podfile中添加了一個新的庫時昔脯,你應該使用pod install命令,而不是pod udpate笛臣,這樣安裝了新增的庫云稚,也不會重復安裝已經(jīng)存在的庫。
使用pod update僅僅只是去更新指定庫的版本(或者全部庫)沈堡。

Pod文件干嘛用的
lock文件是干嘛用的

Podfile.lock 文件記錄所有已安裝的代碼庫的描述.其結構如下

造成死鎖的四個條件
自旋鎖和遞歸鎖的區(qū)別

自旋鎖(spinlock):
同樣用來標記只能有一個線程訪問該對象静陈,在同一線程多次加鎖操作會造成死鎖;使用硬件提供的swap指令或test_and_set指令實現(xiàn);同互斥鎖不同的是在鎖操作需要等待的時候并不是睡眠等待喚醒鲸拥,而是循環(huán)檢測保持者已經(jīng)釋放了鎖拐格,這樣做的好處是節(jié)省了線程從睡眠狀態(tài)到喚醒之間內(nèi)核會產(chǎn)生的消耗,在加鎖時間短暫的環(huán)境下這點會提高很大效率
遞歸鎖(recursivelock):
嚴格上講遞歸鎖只是互斥鎖的一個特例刑赶,同樣只能有一個線程訪問該對象捏浊,但允許同一個線程在未釋放其擁有的鎖時反復對該鎖進行加鎖操作; windows下的臨界區(qū)默認是支持遞歸鎖的撞叨,而linux下的互斥量則需要設置參數(shù)PTHREAD_MUTEX_RECURSIVE_NP金踪,默認則是不支持

Nslock是什么鎖

NSLock是互斥鎖

Nslock里面加Nslock

NSLock是非遞歸鎖,當同一線程重復獲取同一非遞歸鎖時谒所,就會發(fā)生死鎖热康,可以用遞歸鎖代替NSLock,比如NSRecursiveLock或者@synchronized

atomic 安全嗎劣领?用的什么鎖

因為atomic做了線程鎖姐军,所以理論上講atomic是要比nonatomic更加耗費性能、更慢尖淘。
atomic 系統(tǒng)會在生成的setter/getter方法里添加鎖奕锌,但是這個鎖僅僅是保證了setter/getter存取的安全,并不能保證數(shù)據(jù)結果正確 , 用的互斥鎖spinlock_t是os_unfair_lock

信號量里面加信號量有什么問題
監(jiān)聽卡頓怎么監(jiān)聽的村生,為什么在beforewaiting
為什么在主線程刷新UI 子線程也可以刷新UI

因為UIKit框架不是線程安全的惊暴,當多個線程同時操作UI的時候,搶奪資源趁桃,導致崩潰辽话,UI異常等問題
OS中只有主線程才能立即刷新UI。在子線程中是不能夠更新UI卫病,我們看到的子線程能夠更新UI的原因是油啤,等到子線程執(zhí)行完畢,自動進入了主線程去執(zhí)行子線程中更新UI的代碼蟀苛。由于子線程執(zhí)行時間非常短暫益咬,讓我們誤以為子線程可以更新UI。如果子線程一直在運行帜平,則無法更新UI幽告,因為沒有辦法進入主線程。

runloop 是一個循環(huán)嗎
在main中 子線程調(diào)用不會執(zhí)行
FMDB用的什么線程

FMDatabaseQueue

weak怎么處理
weak屬性什么時候銷毀

是通過objc_loadWeak方法進行的裆甩。而根據(jù) Clang的官方文檔冗锁,objc_loadWeak方法會retain并autorelease這個對象。所以給一個weak對象賦值嗤栓,它并不會馬上釋放冻河,而是會放到autorelease pool中,與autorelease pool一起釋放。

自動釋放池原理
自己寫autorelease和不寫autoreleas有什么區(qū)別

手動干預釋放機制:指定autoreleasepool芋绸,就是所謂的作用域大括號結束釋放;
系統(tǒng)自動釋放:不手動指定autoreleasepool担敌。
autorelease對象除了作用域后摔敛,會被添加到最近一次創(chuàng)建的自動釋放池中,并會在當前的runloop迭代結束時釋放全封。
ps:runloop從程序啟動到加載完成是一個完整的運行循環(huán)马昙,然后會停下來,等待用戶交互刹悴,用戶的每一次交互都會啟動一次運行循環(huán)行楞,這時候會創(chuàng)建自動釋放池,來處理用戶所有的點擊事件土匀、觸摸事件子房,在一次完整的運行循環(huán)結束之前,會銷毀自動釋放池就轧,達到銷毀對象的母的

并行 串行
信號量是什么鎖

鎖是服務于共享資源的证杭;而semaphore是服務于多個線程間的執(zhí)行的邏輯順序的。

字典用的什么hash表
hash碰撞怎么解決的妒御,放在減1的位置解愤,為什么
打包用的ipa是怎么加殼

網(wǎng)易云盾

一個字典里面存儲10000個數(shù)據(jù),怎么快速找到
Nsoperation里面的KVO是怎么監(jiān)聽的乎莉,源碼看過嗎
Afnet取消是怎么處理的送讲,這個時候可能服務器有響應,或者沒響應

2.0和3.0區(qū)別

2.0使用的NSURLConnection,3.0使用的是NSURLSession,
1)NSURLConnection下載文件時惋啃,先是將整個文件下載到內(nèi)存哼鬓,然后再寫入到沙盒,如果文件比較大肥橙,就會出現(xiàn)內(nèi)存暴漲的情況魄宏。而使用NSURLSessionUploadTask下載文件,會默認下載到沙盒中的tem文件中存筏,不會出現(xiàn)內(nèi)存暴漲的情況宠互。
2)NSURLConnection停止請求的發(fā)送,停止后不能繼續(xù)訪問椭坚,需要創(chuàng)建新的請求予跌。NSURLSession有三個控制方法,取消(cancel)善茎、暫停(suspend)券册、繼續(xù)(resume),暫停以后可以通過繼續(xù)恢復當前的請求任務。
3)AFN3.0 NSURLSession 不需要2.0NSURLConnection 的常駐線程烁焙。
2.0需要常駐線程是因為請求回調(diào)依賴當前線程航邢,而AFN3.0 NSURLSession的請求回調(diào)不需要依賴當前線程,可以指定回調(diào)的delegateQueue骄蝇,這樣也就不需要再對線程進行鄙乓螅活。

內(nèi)存怎么分

內(nèi)存五大分區(qū): 棧區(qū)九火、堆區(qū)赚窃、全局區(qū)、常量區(qū)岔激、代碼區(qū)

實現(xiàn)一個讀寫鎖
runloop 的三個階段

B站面試

鎖忘了釋放勒极,怎么辦,怎么處理虑鼎,比如oc的try cache

__block 多線程 HTTP2.0加了什么東西

二進制協(xié)議 多工 數(shù)據(jù)流 頭信息壓縮 服務器推送

下面代碼有什么問題

#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
    //變量存在寄存器中
    @autoreleasepool {
        __block NSObject *obj = nil;
        dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
            while (YES) {
                NSLog(@"%@", [obj description]);
            }
        });
        while (YES) {
            obj = [NSObject new];
            NSLog(@"new obj");
        }
    }
    return 0;
}

阿里

大數(shù)據(jù)存儲
用事物
國密算法 都有哪些

  • 國密即國家密碼局認定的國產(chǎn)密碼算法辱匿。主要有SM1,SM2震叙,SM3掀鹅,SM4。密鑰長度和分組長度均為128位媒楼。
  • SM1 為對稱加密乐尊。其加密強度與AES相當。該算法不公開划址,調(diào)用該算法時扔嵌,需要通過加密芯片的接口進行調(diào)用。
  • SM2為非對稱加密夺颤,基于ECC痢缎。該算法已公開。由于該算法基于ECC世澜,故其簽名速度與秘鑰生成速度都快于RSA独旷。ECC 256位(SM2采用的就是ECC 256位的一種)安全強度比RSA 2048位高,但運算速度快于RSA寥裂。
  • 國家密碼管理局公布的公鑰算法嵌洼,其加密強度為256位
  • SM3 消息摘要》馇。可以用MD5作為對比理解麻养。該算法已公開。校驗結果為256位诺舔。
  • SM4 無線局域網(wǎng)標準的分組數(shù)據(jù)算法鳖昌。對稱加密备畦,密鑰長度和分組長度均為128位恕洲。

平安

mutableCopy進行自定義對象拷貝

  • 1.讓類實現(xiàn)NSCopying/NSMutableCopying協(xié)議击困。
  • 2.讓類實現(xiàn)copyWithZone:/mutableCopyWithZone:方法

為分類添加關聯(lián)屬性叉趣,怎么添加一個weak的 屬性默認的是atomic
字符串用等號可以判斷嗎 相同字符串愁憔,創(chuàng)建地址相同

  • 等于號比較的是地址 isEqualToString可以判斷

計算屬性,可以節(jié)省資源

  • 當?shù)谝淮握{(diào)用的時候食棕,會調(diào)暖庄,如果屬性里面的值一直不變问芬,則計算屬性不會再調(diào)用

百度

內(nèi)存管理翼岁,引用計數(shù),什么時候不是0
一個ip地址司光,怎么轉成int琅坡,且,可以變回字符串
AFN和原生的請求有什么區(qū)別 內(nèi)存管理 weak修飾可選型 unown修飾非可選型残家,有區(qū)別的

哈羅面試

autorelease 什么時候釋放

一般情況下榆俺,每個接受autorelease消息的對象,都會在下個runloop開始前被釋放坞淮。也就是說茴晋,在一段同步的代碼中執(zhí)行過程中,生成的對象接受autorelease消息后回窘,一般是不會在作用域結束前釋放的诺擅。
所以嚴謹?shù)恼f, 在沒有手動添加Autorelease Pool的情況下,Autorelease對象是在當前的runloop迭代結束時釋放的啡直,而它能夠釋放的原因是系統(tǒng)在每個runloop迭代中都加入了自動釋放池Push和Pop烁涌。

點擊事件擴大范圍

重寫方法 -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
重寫方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

事件響應

系統(tǒng)通過 IOKit.framework來處理硬件操作,其中屏幕處理也通過IOKit完成(IOKit可能是注冊監(jiān)聽了屏幕輸出的端口)
當用戶操作屏幕酒觅,IOKit收到屏幕操作撮执,會將這次操作封裝為IOHIDEvent對象。通過mach port(IPC進程間通信)將事件轉發(fā)給SpringBoard來處理舷丹。

SpringBoard是iOS系統(tǒng)的桌面程序抒钱。SpringBoard收到mach port發(fā)過來的事件,喚醒main runloop來處理颜凯。

SpringBoard的main runloop將事件交給當前應用程序的source1處理谋币,這時候會喚醒當前應用程序的runloop,當前應用程序的source1會調(diào)用__IOHIDEventSystemClientQueueCallback()函數(shù),該函數(shù)內(nèi)部會判斷装获,是否有程序在前臺顯示瑞信,如果有則通過mach port將IOHIDEvent事件轉發(fā)給這個程序。

如果前臺沒有程序在顯示穴豫,則表明SpringBoard的桌面程序在前臺顯示凡简,也就是用戶在桌面進行了操作逼友。__IOHIDEventSystemClientQueueCallback()函數(shù)會將事件交給source0處理,source0會調(diào)用__UIApplicationHandleEventQueue()函數(shù)秤涩,函數(shù)內(nèi)部會做具體的處理操作帜乞。

例如用戶點擊了某個應用程序的icon,會將這個程序啟動筐眷。

應用程序接收到SpringBoard傳來的消息黎烈,會喚醒main runloop并將這個消息交給source1處理,source1調(diào)用__IOHIDEventSystemClientQueueCallback()函數(shù)匀谣,在函數(shù)內(nèi)部會將事件交給source0處理照棋,并調(diào)用source0的__UIApplicationHandleEventQueue()函數(shù)。
在__UIApplicationHandleEventQueue()函數(shù)中武翎,會將傳遞過來的IOHIDEvent轉換為UIEvent對象烈炭。

在函數(shù)內(nèi)部,將事件放入UIApplication的事件隊列宝恶,等到處理該事件時符隙,將該事件出隊列,UIApplication將事件傳遞給窗口對象(UIWindow)垫毙,如果存在多個窗口霹疫,則從后往前詢問最上層顯示的窗口

窗口UIWindow通過hitTest和pointInside操作,判斷是否可以響應事件综芥,如果窗口UIWindow不能響應事件丽蝎,則將事件傳遞給其他窗口;若窗口能響應事件膀藐,則從后往前詢問窗口的子視圖征峦。

以此類推,如果當前視圖不能響應事件消请,則將事件傳遞給同級的上一個子視圖栏笆;如果能響應,就從后往前遍歷當前視圖的子視圖臊泰。

如果當前視圖的子視圖都不能響應事件蛉加,則當前視圖就是第一響應者。

找到第一響應者缸逃,事件的傳遞的響應鏈也就確定的针饥。

如果第一響應者非UIControl子類且響應鏈上也沒有綁定手勢識別器UIGestureRecognizer;

那么由于第一響應者具有處理事件的最高優(yōu)先級,因此UIApplication會先將事件傳遞給它供其處理需频。首先丁眼,UIApplication將事件通過 sendEvent: 傳遞給事件所屬的window,window同樣通過 sendEvent: 再將事件傳遞給hit-tested view昭殉,即第一響應者,第一響應者具有對事件的完全處理權苞七,默認對事件不進行處理藐守,傳遞給下一個響應者(nextResponder);如果響應鏈上的對象一直沒有處理該事件蹂风,則最后會交給UIApplication卢厂,如果UIApplication實現(xiàn)代理,會交給UIApplicationDelegate惠啄,如果UIApplicationDelegate沒處理慎恒,則該事件會被丟棄。

如果第一響應者非UIControl子類但響應鏈上也綁定了手勢識別器UIGestureRecognizer;

UIWindow會將事件先發(fā)送給響應鏈上綁定的手勢識別器UIGestureRecognizer撵渡,再發(fā)送給第一響應者融柬,如果手勢識別器能成功識別事件,UIApplication默認會向第一響應者發(fā)送cancel響應事件的命令;如果手勢識別器未能識別手勢趋距,而此時觸摸并未結束丹鸿,則停止向手勢識別器發(fā)送事件,僅向第一響應者發(fā)送事件棚品。如果手勢識別器未能識別手勢,且此時觸摸已經(jīng)結束廊敌,則向第一響應者發(fā)送end狀態(tài)的touch事件铜跑,以停止對事件的響應。

如果第一響應者是自定義的UIControl的子類同時響應鏈上也綁定了手勢識別器
UIGestureRecognizer;這種情況跟第一響應者非UIControl子類但響應鏈上也綁定了手勢識別器UIGestureRecognizer`處理邏輯一樣;

如果第一響應者是UIControl的子類且是系統(tǒng)類(UIButton骡澈、UISwitch)同時響應鏈上也綁定了手勢識別器UIGestureRecognizer;

UIWindow會將事件先發(fā)送給響應鏈上綁定的手勢識別器UIGestureRecognizer锅纺,再發(fā)送給第一響應者,如果第一響應者能響應事件肋殴,UIControl調(diào)用調(diào)用sendAction:to:forEvent:將target囤锉、action以及event對象發(fā)送給UIApplication,UIApplication對象再通過 sendAction:to:from:forEvent:向target發(fā)送action护锤。

GCD怎么取消

iOS8之后可以調(diào)用dispatch_block_cancel來取消(需要注意必須用dispatch_block_create創(chuàng)建dispatch_block_t官地,dispatch_block_cancel也只能取消尚未執(zhí)行的任務,對正在執(zhí)行的任務不起作用烙懦。)

定義外部變量驱入,用于標記block是否需要取消

autorelease和runloop什么關系

NSRunloop是一個消息循環(huán),會監(jiān)測輸入源(inputsource)和定時源(timer source)氯析。apple官方文檔(多線程編程指南)描述: "run loop 是用來在線程上管理事件異步到達的基礎設施......run loop在沒有任何事件處理的時候會把它的線程置于休眠狀態(tài),它消除了消耗CPU周期輪詢,并防止處理器本身進入休眠狀態(tài)并節(jié)省電源亏较。"消除CPU空轉是它最大的作用。
Runloop的重點是:
1.用來監(jiān)聽長耗時異步事件掩缓,例如網(wǎng)絡回調(diào)雪情,蘋果原生和第三方用的都是Runloop。
2.消除CPU空轉你辣。
每個線程都有一個默認的NSRunloop巡通,主線程中的NSRunloop默認是運行的尘执,非主線程中的NSRunloop默認是沒有運行的,通常需要為NSRunloop添加一個事件然后去運行扁达。一般情況下沒有必要去啟動一個線程的NSRunloop正卧,除非需要長久的去監(jiān)測某個異步事件。舉個具體的例子跪解,NSURLConnection網(wǎng)絡數(shù)據(jù)請求炉旷,默認是異步的方式,其創(chuàng)建原理就是創(chuàng)建之后將其作為事件源加入當前的Runloop,而等待網(wǎng)絡響應的過程是在一個新建的獨立的線程中完成叉讥,當這個線程處理到某個階段比如收到響應后便通知之前的線程去執(zhí)行相應的delegate方法窘行。
對于每一個runloop,Entry事件(即將進入Loop)图仓,其回調(diào)內(nèi)會調(diào)用 _objc_autoreleasePoolPush() 創(chuàng)建自動釋放池罐盔,這樣所有的AutoreleasePool會構成一個像CallStact一樣的棧式結構,在每一個Runloop結束時救崔,Exit(即將退出Loop)調(diào)用_objc_autoreleasePoolPop() 惶看,當前棧頂?shù)腁utoreleasePool會被銷毀,這樣這個Pool里面的每個object都有被release六孵。

所以runloop 和AutoReleasepool是通過線程的方式一一對應的

有arc了為啥還需要autoreleasepool

ARC 并不是舍棄了 @autoreleasepool纬黎,而是在編譯階段幫你插入必要的 retain/release/autorelease 的代碼調(diào)用。

所以劫窒,跟你想象的不一樣本今,ARC 之下依然是延時釋放的,依然是依賴于 NSAutoreleasePool主巍,跟非 ARC 模式下手動調(diào)用那些函數(shù)本質(zhì)上毫無差別冠息,只是編譯器來做會保證引用計數(shù)的正確性。

用@autoreleasepool是有用的孕索。
正常情況下逛艰,你創(chuàng)建的變量會在超出其作用域的時候被釋放掉。
而如果你的函數(shù)寫的很長搞旭,在你函數(shù)運行過程中出現(xiàn)很多中間變量瓮孙,占據(jù)了大量的內(nèi)存,怎么辦选脊?
用@autoreleasepool杭抠。
在@autoreleasepool中創(chuàng)建的變量,會在@autoreleasepool結束的時候執(zhí)行一次release恳啥,進行釋放偏灿。其實@autoreleasepool就相當于一層作用域。

Https 是怎么通信的

HTTPS通信主要包括幾個節(jié)點钝的,發(fā)起請求翁垂、驗證身份铆遭、協(xié)商秘鑰、加密會話沿猜,具體流程如下(此例子只有客戶端對服務端的單向驗證):

1枚荣、客戶端向服務端發(fā)起建立HTTPS請求。

2啼肩、服務器向客戶端發(fā)送數(shù)字證書橄妆。

3、客戶端驗證數(shù)字證書祈坠,證書驗證通過后客戶端生成會話密鑰(雙向驗證則此處客戶端也會向服務器發(fā)送證書)害碾。

4、服務器生成會話密鑰(雙向驗證此處服務端也會對客戶端的證書驗證)赦拘。

5慌随、客戶端與服務端開始進行加密會話。

Block里面什么時候要強引用一下

如果函數(shù)執(zhí)行過程中self變?yōu)閚il了躺同,那么函數(shù)一開始聲明的strongSelf會暫時持有著self阁猜,此時會有一個暫時的引用循環(huán)。當函數(shù)執(zhí)行完(即是Block執(zhí)行完)蹋艺,strongSelf超出作用域被釋放剃袍,引用循環(huán)從這里開始打破。接下來车海,由于沒有任何強引用持有self了,于是self被釋放隘击,最后Block也因為沒有任何強引用持有它也被釋放了侍芝。所有對象就都被順利釋放了。

__weak 和__strong 一定要成對出現(xiàn)嗎埋同? 舉個例子

__weak修飾的對象被Block引用,不會影響對象的釋放,而__strong在Block內(nèi)部修飾的對象,會保證,在使用這個對象在scope內(nèi),這個對象都不會被釋放,出了scope,引用計數(shù)就會-1,且__strong主要是用在多線程運用中,若果只使用單線程,只需要使用__weak即可

抓包需要證書嗎州叠? 需要
怎么抓取微信的包

Https 安全嗎? 不安全怎么辦

哈羅二面

KVO是多線程的嗎凶赁,同步還是異步

將修改對象屬性過程放在子線程內(nèi)執(zhí)行,在監(jiān)聽回調(diào)方法內(nèi)獲取當前線程同樣為子線程.故KVO的響應和KVO觀察的值變化是在一個線程上的.
一個需要注意的地方是咧栗,KVO 行為是同步的,并且發(fā)生與所觀察的值發(fā)生變化的同樣的線程上虱肄。沒有隊列或者 Run-loop 的處理致板。手動或者自動調(diào)用 -didChange... 會觸發(fā) KVO 通知。
所以咏窿,當我們試圖從其他線程改變屬性值的時候我們應當十分小心斟或,除非能確定所有的觀察者都用線程安全的方法處理 KVO 通知。通常來說集嵌,我們不推薦把 KVO 和多線程混起來萝挤。如果我們要用多個隊列和線程御毅,我們不應該在它們互相之間用 KVO。

KVO 是同步運行的這個特性非常強大怜珍,只要我們在單一線程上面運行(比如主隊列 main queue)

大量數(shù)據(jù)對一個屬性觀察端蛆,有什么問題 怎么實現(xiàn)一個埋點

常見的埋點有三種
頁面進入次數(shù)
頁面停留時間
點擊事件
針對1、2兩種埋點實現(xiàn)相對比較容易酥泛,我們可以使用runtime替換掉VC的viewWillAppear和viewWillDisappear兩個系統(tǒng)方法來加入埋點代碼今豆。

點擊事件的埋點由于業(yè)務場景比較多,要實現(xiàn)無侵入埋點就比較難了揭璃。
思路:
我們可以使用runtime替換到點擊事件sendAction:to:forEvent:晚凿,然后在替換方法里加入埋點代碼。還是前面說的瘦馍,點擊事件場景比較多歼秽,要確定某個點擊事件比較復雜。目前我們點擊事件埋點還是在具體的某個點擊事件里加入埋點代碼情组。

識貨

自己實現(xiàn)一個異常的捕獲

  1. 系統(tǒng)Crash
    對于系統(tǒng)Crash而引起的程序異常退出燥筷,可以通過UncaughtExceptionHandler機制捕獲;也就是說在程序中catch以外的內(nèi)容院崇,被系統(tǒng)自帶的錯誤處理而捕獲肆氓。我們要做的就是用自定義的函數(shù)替代該ExceptionHandler即可。
  2. 處理signal
    使用Objective-C的異常處理是不能得到signal的底瓣,如果要處理它谢揪,我們還要利用unix標準的signal機制,注冊SIGABRT, SIGBUS, SIGSEGV等信號發(fā)生時的處理函數(shù)捐凭。該函數(shù)中我們可以輸出棧信息拨扶,版本信息等其他一切我們所想要的。

html怎么調(diào)用oc 底層怎么實現(xiàn)的
Swift中的RAC 不管是哪個vc怎么獲取viewdidload方法
用方法交換
怎么讓父類的initial方法不調(diào)用

如果分類和父類均實現(xiàn)了+initialize茁肠,則只有分類的+initialize會被調(diào)用患民;
如果父類和子類均實現(xiàn)了+initialize,第一次引用 子類時垦梆,先調(diào)用父類的+initialize匹颤,再調(diào)用子類的+initialize;
如果子類未實現(xiàn)initialize 方法托猩,父類實現(xiàn)了+initialize印蓖,則第一次引用子類時,會調(diào)用兩次父類的+initialize

奔潰有幾種方式

數(shù)組下標越界
字典構造與修改
NSAttributedString相關
呈現(xiàn)一個空控制器
強引用一個單例對象
unrecognized selector
操作tableView數(shù)據(jù)
Push到同一個控制器多次

中通一面:

AFN的緩存 怎么存儲的 AFNetworking的緩存機制

關于AFNetworking的緩存機制

LRU緩存和 NSCache怎么存儲的

NSCache主要用來存儲臨時數(shù)據(jù)(鍵值對)京腥,當內(nèi)存資源不夠時另伍,系統(tǒng)會自動釋放部分數(shù)據(jù)。它有三個特點:
? NSCache為了保持不占用過多的系統(tǒng)內(nèi)存,它有多種自動回收內(nèi)存策略摆尝;當系統(tǒng)內(nèi)存出現(xiàn)不足時温艇,它會回收部分內(nèi)存使系統(tǒng)正常運轉,這種回收是不可控的堕汞。
? 可以在多線程中對NSCache進行訪問勺爱,同時不需要加鎖,因為它是線程安全的讯检。
? 與NSMutableDictionary不同琐鲁,NSCache不會copy其內(nèi)部的鍵對象。
由上邊的特點看出人灼,NSCache是一個很好的內(nèi)存緩存類围段,通過它我們可以實現(xiàn)數(shù)據(jù)的緩存功能。常見的開源框架中也有NSCache的使用投放,AFN的圖片緩存奈泪,SDWebImage等。

怎么去中斷一個線程
coreData 中怎么創(chuàng)建主鍵
coreData 沒有主鍵的概念
CoreData 多線程

讀寫文件時灸芳,讀和寫都不安全嗎

京東

c語言 constconst

當在最前面的時候,表示指針不允許被改變,值可以改變.
const NSString * nameFir = @"test";
當在中間的時候,同上
NSString const * nameSec = @"test";
當在最后的時候,表示指針可以被改變,但是值不能改變(最常用)
NSString * const nameThi = @"test";

  • 經(jīng)驗總結 const右邊最近的內(nèi)容不可以被改變.

c語言涝桅,結構體和共同體

bss段 http://www.reibang.com/p/2d4acf4a53f9
內(nèi)存分為5個區(qū)域,分別指的是----->棧區(qū)/堆區(qū)/BSS段/數(shù)據(jù)段/代碼段 棧:存儲局部變量烙样,當其作用域執(zhí)行完畢之后冯遂,就會被系統(tǒng)立即收回
堆:存儲OC對象,手動申請的字節(jié)空間谒获,需要調(diào)用free來釋放
BSS段:未初始化的全局變量和靜態(tài)變量蛤肌,一旦初始化就會從BSS段中回收掉,轉存到數(shù)據(jù)段中
數(shù)據(jù)段:存儲已經(jīng)初始化的全局變量和靜態(tài)變量批狱,以及常量數(shù)據(jù)裸准,直到結束程序時才會被立即收回
常量區(qū):存放常量字符串,程序結束后由系統(tǒng)釋放
代碼段:存放函數(shù)的二進制代碼精耐,直到結束程序時才會被立即收回

int和NSinteger有什么區(qū)別

NSInteger會自動識別當前電腦系統(tǒng)是32位還是64位數(shù)狼速,然后自動返回最大的類型(int還是NSInteger)琅锻。例如卦停,當前電腦為32位系統(tǒng),你聲明的NSInteger自動變?yōu)閕nt。當前電腦為64位系統(tǒng),你聲明的NSInteger還是NSInteger恼蓬。
所以32位系統(tǒng)惊完,int的長度等于NSInteger的長度;64位系統(tǒng)处硬,int的長度小于NSInteger的長度小槐;也就是說NSInteger的長度一定是大于等于int的長度的。
知道了這個原理,當你不知道電腦的系統(tǒng)是幾位凿跳,并且你正在聲明一個整形變量件豌,你一定要使用NSInteger,不要使用int,你可以當成一種規(guī)范控嗜。記准胪:在多數(shù)情況下一定盡可能的使用NSInteger。
重定向碼是多少疆栏,放在那個字段里面 重定向曾掂,300-399,放在location字段
為什么4次揮手

oc調(diào)is

要先注冊
二 我們在控制器中初始化WKWebView,注冊方法.

1.初始化

//創(chuàng)建網(wǎng)頁配置對象.
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    //是使用h5的視頻播放器在線播放, 還是使用原生播放器全屏播放
    configuration.allowsInlineMediaPlayback = YES;
    //設置視頻是否需要用戶手動播放  設置為NO則會允許自動播放
    if (@available(iOS 10.0, *)) {
        configuration.mediaTypesRequiringUserActionForPlayback = YES;
    } else {}
    //設置是否允許畫中畫技術 在特定設備上有效
    configuration.allowsPictureInPictureMediaPlayback = YES;
    //設置請求的User-Agent信息中應用程序名稱 iOS9后可用
    configuration.applicationNameForUserAgent = @"ChinaDailyForiPad";

   //自定義的WKScriptMessageHandler 是為了解決內(nèi)存不釋放的問題.
    WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
    //這個類主要用來做native與JavaScript的交互管理
    WKUserContentController * wkUController = [[WKUserContentController alloc] init];
    //注冊一個name為jsToOcNoPrams的js方法 設置處理接收JS方法的對象
    [wkUController addScriptMessageHandler:weakScriptMessageDelegate  name:@"jsToOcNoPrams"];
    [wkUController addScriptMessageHandler:weakScriptMessageDelegate  name:@"jsToOcWithPrams"];
    configuration.userContentController = wkUController;

   //創(chuàng)建設置對象.
    WKPreferences *preference = [[WKPreferences alloc]init];
    //最小字體大小 當將javaScriptEnabled屬性設置為NO時壁顶,可以看到明顯的效果
    preference.minimumFontSize = 0;
    //設置是否支持javaScript 默認是支持的
    preference.javaScriptEnabled = YES;
    //在iOS上默認為NO珠洗,表示是否允許不經(jīng)過用戶交互由javaScript自動打開窗口
    preference.javaScriptCanOpenWindowsAutomatically = YES;
    configuration.preferences = preference;

   self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) configuration:configuration];
    //UI代理.
    self.webView.UIDelegate = self;
    //導航代理.
    self.webView.navigationDelegate = self;
    //是否允許手勢左滑返回上一級, 類似導航控制的左滑返回.
    self.webView.allowsBackForwardNavigationGestures = YES;

(滑動顯示更多)

autolayout 與frame區(qū)別

把frame設置寫到layoutSubviews中或者寫到viewDidLayoutSubviews中即可。因為約束生效時view的center或者bounds就會被修改若专,center或者bounds被修改時layoutSubview,就會被調(diào)用许蓖,隨后viewDidLayoutSubviews就回被調(diào)用。這個時候富岳,設置約束的視圖frame就不再是(0,0,0,0)了
如果我們必須要將約束和frame寫在同一方法中蛔糯,寫完約束就設置frame,而不是想把frame的設置寫到layoutSubview中(比如我們設置好約束后馬上就想根據(jù)約束的結果計算高度)窖式,那么我們還可以在設置完約束之后手動調(diào)用layoutIfNeeded方法蚁飒,讓視圖立即layout,更新frame萝喘。在這之后就可以拿到設置約束的視圖的尺寸了淮逻。

值類型屬性包裝器

怎么判斷對鉤手勢

  • assign修飾,釋放不了阁簸,出現(xiàn)野指針

狀態(tài)機
iOS開發(fā)筆記之七十三——基于狀態(tài)機的頁面構建方案_iOS開發(fā)筆記-CSDN博客_ios 狀態(tài)機

關聯(lián)庫
設計一個app爬早,架構上
點擊H5會調(diào)原生的方法,原理是因為攔截
要先注冊
https://mp.weixin.qq.com/s/iFEfgzU1g9RghFb9rpLHCg

left和leading 區(qū)別

在中國 启妹,left和leading是一樣的筛严,但是在阿拉伯,leading相當于right

三等分一個view

Swift

逃逸與非逃逸注意點

非逃逸閉包:閉包調(diào)用發(fā)生在函數(shù)結束前饶米,閉包調(diào)用在函數(shù)作用域內(nèi)
逃逸閉包:閉包調(diào)用有可能在函數(shù)結束后調(diào)用桨啃,閉包調(diào)用逃離了函數(shù)的作用域,需要@escaping聲明
逃逸閉包不能捕獲inout參數(shù)

MVVM
MVVM的作用就瘦身嗎
二進制重拍
線程同步檬输,使用鎖
檢測存在uiwebview 用逆向Grep

block獲取的是地址值嗎

block 捕獲的是指針指向的內(nèi)存地址 __blcok修飾可以捕獲指針的地址

nsurlsession 和nsurlconnection 區(qū)別

設計一個malloc 和release

    UIGraphicsBeginImageContextWithOptions(contentSize, NO, [UIScreen mainScreen].scale);
    CGContextRef content = UIGraphicsGetCurrentContext();
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    CFRelease(path);

http 緩存

Cache-control

copy自定義對象照瘾?如何拷貝大的數(shù)據(jù)量
使用歸檔

如果對象很多或者層級很多,實現(xiàn)起來還是很麻煩的丧慈。如果需要實現(xiàn)完全復制同樣還有另有一種方法析命,那就是歸檔:

UI問題,tableciew有3個半,那一共有幾個
copy很多數(shù)據(jù)
方法不讓別人用鹃愤,報錯簇搅,怎么寫代碼

使用NS_DESIGNATED_INITIALIZER,NS_UNAVAILABLE將可以禁止系統(tǒng)方法的使用,所以如果你想禁止使用某個方法可以盡量用NS_DESIGNATED_INITIALIZER,NS_UNAVAILABLE來修飾方法

組件化软吐,使用字典會有很多字符串(硬編碼)

怎么優(yōu)化馍资,傳遞模型?

关噪,Swift
Json轉Model

面試
https://juejin.cn/post/7006273689675120677

lazy遇到的問題
https://juejin.cn/post/6844903571209584653

沒故事的桌同學 Swift Collection 中的 lazy 作用

全局隊列有2個枚舉

競爭和非競爭

http 3次握手之前做什么

DNS 轉ip

瀑布流

鎖怎么工作的
Runloop 有幾種不同狀態(tài)鸟蟹,會退出嗎

source0 // 處理觸摸事件 例如:performSelector:onThread
Source1 // 基于Port 的線程間通信
Timers // NSTimer performSelector:withObject:afterDelay
Observers // 用于監(jiān)聽RunLoop的狀態(tài) UI 刷新 (BeforeWaiting) AutoRelease pool (BeforeWaiting)

Hook方法注入是動態(tài)庫,那系統(tǒng)是如何調(diào)用我們的方法的

如何交換c語言的方法
檢測FPS

交換oc方法使兔,但是要自己寫的方法和交換的方法都執(zhí)行建钥,怎么處理

imp和sel區(qū)別,和Select有什么區(qū)別

SEL:類成員方法的指針虐沥,與C的函數(shù)指針不一樣熊经,函數(shù)指針直接保存了方法的地址,而SEL只是方法的編號欲险。
IMP是函數(shù)指針镐依,指向方法的地址。

方法名稱不包括返回類型天试、參數(shù)類型槐壳,而又因為方法名相同對應的SEL相同,所以Objc不支持相同的方法名有不同的返回類型喜每,也不支持重載务唐,不過類方法和實例方法可以有相同的名字,而又有不同類型的參數(shù)和返回類型带兜,因為它們不是處在同一張diapatch table中枫笛。
不僅類的方法可以在運行時創(chuàng)建,類本身也可以在運行時刻創(chuàng)建刚照,只要類繼承NSObject類刑巧。

OC如何實現(xiàn)多繼承

  1. 通過組合的方式實現(xiàn)多繼承
    這種方式最簡單粗暴,在子類中創(chuàng)建父類對象无畔,外部調(diào)用時讓父類對象去調(diào)用父類方法啊楚,從而實現(xiàn)多繼承。
  2. 通過協(xié)議實現(xiàn)多繼承
    因為OC允許一個類遵守多個協(xié)議檩互,所以我們可以通過協(xié)議的方式模擬多繼承特幔。但是協(xié)議只能提供接口咨演,不能提供實現(xiàn)闸昨,所以我們需要在子類中添加對應的實現(xiàn),這也注定了協(xié)議實現(xiàn)多繼承是不完美的。
  3. 通過分類Category實現(xiàn)多繼承

socket和http區(qū)別

HTTP協(xié)議:簡單對象訪問協(xié)議饵较,對應于應用層 拍嵌,HTTP協(xié)議是基于TCP連接的
  tcp協(xié)議: 對應于傳輸層
  ip協(xié)議: 對應于網(wǎng)絡層
TCP/IP是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡中傳輸循诉;而HTTP是應用層協(xié)議横辆,主要解決如何包裝數(shù)據(jù)。
  Socket是對TCP/IP協(xié)議的封裝茄猫,Socket本身并不是協(xié)議狈蚤,而是一個調(diào)用接口(API),通過Socket划纽,才能使用TCP/IP協(xié)議脆侮。
  http連接:http連接就是所謂的短連接,即客戶端向服務器端發(fā)送一次請求勇劣,服務器端響應后連接即會斷掉靖避;
  socket連接:socket連接就是所謂的長連接,理論上客戶端和服務器端一旦建立起連接將不會主動斷掉比默;但是由于各種環(huán)境因素可能會是連接斷開幻捏,比如說:服務器端或客戶端主機down了,網(wǎng)絡故障命咐,或者兩者之間長時間沒有數(shù)據(jù)傳輸篡九,網(wǎng)絡防火墻可能會斷開該連接以釋放網(wǎng)絡資源。

mmap

熟悉fastlane的工具

點擊一個按鈕醋奠,runloop 怎么走的

Masonry有什么缺點瓮下,時間復雜度是多少

網(wǎng)絡訪問ip
目標ip和源ip會有變化嗎
不會

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钝域,隨后出現(xiàn)的幾起案子讽坏,更是在濱河造成了極大的恐慌,老刑警劉巖例证,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件路呜,死亡現(xiàn)場離奇詭異,居然都是意外死亡织咧,警方通過查閱死者的電腦和手機胀葱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笙蒙,“玉大人抵屿,你說我怎么就攤上這事⊥蔽唬” “怎么了轧葛?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵搂抒,是天一觀的道長。 經(jīng)常有香客問我尿扯,道長求晶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任衷笋,我火速辦了婚禮芳杏,結果婚禮上,老公的妹妹穿的比我還像新娘辟宗。我一直安慰自己爵赵,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布泊脐。 她就那樣靜靜地躺著亚再,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晨抡。 梳的紋絲不亂的頭發(fā)上氛悬,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音耘柱,去河邊找鬼如捅。 笑死,一個胖子當著我的面吹牛调煎,可吹牛的內(nèi)容都是我干的镜遣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼士袄,長吁一口氣:“原來是場噩夢啊……” “哼悲关!你這毒婦竟也來了?” 一聲冷哼從身側響起娄柳,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤寓辱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赤拒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秫筏,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年挎挖,在試婚紗的時候發(fā)現(xiàn)自己被綠了这敬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蕉朵,死狀恐怖崔涂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情始衅,我是刑警寧澤冷蚂,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布缭保,位于F島的核電站,受9級特大地震影響帝雇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛉拙,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一尸闸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孕锄,春花似錦吮廉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至轴脐,卻和暖如春调卑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背大咱。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工恬涧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碴巾。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓溯捆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厦瓢。 傳聞我的和親對象是個殘疾皇子提揍,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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

  • 1.探究KVO的底層實現(xiàn)原理 http://www.reibang.com/p/829864680648 ·KV...
    大馮宇宙閱讀 2,753評論 0 3
  • 1. iOS開發(fā)中的加密方式 iOS加密相關算法框架:CommonCrypto。 對稱加密: DES煮仇、3DES劳跃、A...
    Dezi閱讀 1,223評論 0 7
  • 未完,待更新 一浙垫、必備題 1售碳、AFN 原理 鏈接:AFNetworking源碼——基本架構 - 簡書 2、SDWe...
    小熊_07cb閱讀 2,732評論 3 27
  • 聲明:面試是對自我審視的一種過程绞呈,面試題和iOS程序員本身技術水平?jīng)]有對等關聯(lián)贸人,無論你能否全部答出,都不要對自己產(chǎn)...
    Kevin_wzx閱讀 2,144評論 1 2
  • 1佃声、什么是多線程艺智? 多線程(multithreading),是指從軟件或者硬件上實現(xiàn)多個線程并發(fā)執(zhí)行的技術圾亏。具有多...
    Longshihua閱讀 1,743評論 0 11