精選面試題教你應(yīng)對高級iOS開發(fā)面試官(提供底層進階規(guī)劃藍圖)

Runloop和線程的關(guān)系

1.—一對應(yīng)行施,主線程的runloop已經(jīng)創(chuàng)建菲饼,子線程的必須手動創(chuàng)建
2.runloop在第一次獲取時創(chuàng)建,在線程結(jié)束時銷毀
//在runloop中有多個運行模式,但是只能選擇一種模式運行义辕,mode 中至少要有一個timer或者是source
Mode:
系統(tǒng)默認注冊5個Mode:
kCFRunLoopDefaultMode:App默認mode历谍,通常主線程在這個mode下運行
UITrackingRunLoopMode:界面跟蹤mode现拒,用于Scrollview追蹤觸摸滑動,保證滑動時不受其他 mode 影響

kCFRunLoopCommonModes:占位用的mode望侈,不是一個真正的mode
NSRunLoopCommonModes 相當(dāng)于NSDefaultRunLoopMode + UITrackingRunLoopModeUIInitializationRunLoopMode
UITrackingRunLoopModeUIInitializationRunLoopMode:剛啟動App 時進入的第一個mode印蔬,啟動完成之后不再使用
GSEventReceiveRunLoopMode:接受系統(tǒng)事件的內(nèi)部mode,通常用不到

在這里插入圖片描述

在這里插入圖片描述

自動釋放池什么時候釋放?

//第一次創(chuàng)建︰啟動runloop時候
//最后一次銷毀:runloop 退出的時候
//其他時候的創(chuàng)建和銷毀:當(dāng)runloop即將睡眠時銷毀之前的釋放池脱衙,重新創(chuàng)建一個新的

什么情況下使用weak 關(guān)鍵字侥猬,和assign的區(qū)別?

1、ARC中捐韩,有可能出現(xiàn)循環(huán)引用的地方使用退唠,比如:delegate 屬性
2、自定義IBOutlet控件屬性一般也是使用weak
區(qū)別: weak表明一種非持有關(guān)系奥帘,必須用于OC對象;assign用于基本數(shù)據(jù)類型

怎么用copy關(guān)鍵字?

1铜邮、NSString、NSArray寨蹋、NSDictionary等等經(jīng)常使用copy關(guān)鍵字松蒜,是因為他們有對應(yīng)的可變類型:NSMutableString、NSMutableArray已旧、NSMutableDictionary;他們之間可能進行賦值操作秸苗,為確保對象中的字符串值不會無意間變動,應(yīng)該在設(shè)置新屬性值時拷貝一份运褪。
2惊楼、block也使用copy

*@property (copy)NSMutableArray array;這寫法會出什么問題?

1、添加,刪除,修改數(shù)組內(nèi)的元素的時候,程序會因為找不到對應(yīng)的方法而崩潰秸讹,因為copy 就是復(fù)制一個不可變NSArray的對象;
2檀咙、使用了atomic屬性會嚴重影響性能﹔

如何讓自己的類用copy修飾符?即讓自己寫的對象具備拷貝功能

具體步驟:
1、需聲明該類遵從NSCopying 或 NSMutableCopying協(xié)議2璃诀、實現(xiàn) NSCopying 協(xié)議弧可。該協(xié)議只有一個方法:
-(id)copywithzone : (NSzone *)zone;

@property的本質(zhì)是什么? ivar、getter劣欢、setter如何生成并添加到這個類中的

本質(zhì):@property = ivar + getter + setter;(實例變量+getter方法+setter方法)在編譯期自動生成getter棕诵、setter裁良,還自動向類中添加適當(dāng)類型的實例變量,也可以用synthesize語法來指定實例變量的名字

@protocol 和category中如何使用@property?

1校套、在protocol中使用property只會生成 setter和 getter方法聲明价脾,使用屬性的目的,是希望遵守該協(xié)議的對象能實現(xiàn)該屬性
2笛匙、category使用@property 也是只會生成 setter和 getter方法聲明侨把,如果真的需要給category增加屬性的實現(xiàn),需要借助于運行時的兩個函數(shù)︰
objc_setAssociatedObject
objc _getAssociatedobject

@property中有哪些屬性關(guān)鍵字?

1膳算、原子性—- nonatomic特質(zhì)
2座硕、讀/寫權(quán)限 readwrite(讀寫)、readonly(只讀)
3涕蜂、內(nèi)存管理語義— assign华匾、strong、weak机隙、unsafe_unretained蜘拉、copy
4、方法名一getter=< name > . setter=< name >

weak屬性需要在dealloc中置nil么?

不需要有鹿,在ARC環(huán)境無論是強指針還是弱指針都無需在 dealloc設(shè)置為 nil旭旭,ARC 會自動幫我們處理,即便是編譯器不幫我們做這些,weak也不需要在dealloc中置nil,runtime內(nèi)部已經(jīng)幫我們實現(xiàn)了

@synthesize和@dynamic分別有什么作用?

1葱跋、@property有兩個對應(yīng)的詞持寄,一個是@synthesize,一個是@dynamic娱俺。如果@synthesize和@dynamic都沒寫稍味,那么默認的就是@syntheszie var = _var;
2、@synthesize的語義是如果你沒有手動實現(xiàn) setter方法和 getter方法荠卷,那么編譯器會自動為你加上這兩個方法
3模庐、@dynamic告訴編譯器∶屬性的setter 與 getter方法由用戶自己實現(xiàn),不自動生成油宜。(當(dāng)然對于readonly 的屬性只需提供 getter即可)掂碱。假如一個屬性被聲明為dynamic var,然后你沒有提供@setter方法和@getter方法慎冤,編譯的時候沒問題疼燥,但是當(dāng)程序運行到instance.var = someVar,由于缺 setter方法會導(dǎo)致程序崩潰;或者當(dāng)運行到someVar = var時蚁堤,由于缺 getter方法同樣會導(dǎo)致崩潰醉者。編譯時沒問題,運行時才執(zhí)行相應(yīng)的方法,這就是所謂的動態(tài)綁定湃交。

@synthesize合成實例變量的規(guī)則是什么?假如property名為foo,存在一個名為_foo的實例變量,那么還會自動合成新變量么?

@synthesize合成實例變量的規(guī)則藤巢,有以下幾點:

  • 如果指定了成員變量的名稱,會生成一個指定的名稱的成員變量搞莺,
  • 如果這個成員已經(jīng)存在了就不再生成了.
  • 如果是@synthesize foo;還會生成一個名稱為foo的成員變量,也就是說:如果沒有指定成員變量的名> 稱會自動生成一個屬性同名的成員變量掂咒,
  • 如果是@synthesize foo = _foo;就不會生成成員變量了.
    假如 property 名為 foo才沧,存在一個名為_foo的實例變量,那么還會自動合成新變量么?不會绍刮。

在有了自動合成屬性實例變量之后温圆,@synthesize還有哪些使用場景?

  • 同時重寫了setter和getter時,系統(tǒng)就不會生成ivar孩革,使用@synthesize foo =_foo;關(guān)聯(lián)@property 與ivar
  • 重寫了只讀屬性的getter 時
  • 使用了@dynamic 時
  • 在@protocol中定義的所有屬性
  • 在category中定義的所有屬性
  • 重載的屬性岁歉,當(dāng)在子類中重載了父類中的屬性,必須使用@synthesize來手動合成ivar

objc中向一個nil對象發(fā)送消息將會發(fā)生什么?

在objective-C中向nil 發(fā)送消息是完全有效的—只是在運行時不會有任何作用如果一個方法返回值是一個對象膝蜈,那么發(fā)送給nil的消息將返回o(nil)锅移,如果向一個nil對象發(fā)送消息,首先在尋找對象的isa指針時就是o地址返回了饱搏,所以不會出現(xiàn)任何錯誤非剃。

objc中向一個對象發(fā)送消息[obj foo]和objc_msgSend()函數(shù)之間有什么關(guān)系?

[obj foo];在objc動態(tài)編譯時,每個方法在運行時會被動態(tài)轉(zhuǎn)為消息發(fā)送推沸,即為:objc_msgSend(obj备绽,@selector(foo) ) ;

runtime如何通過selector找到對應(yīng)的IMP地址?(分別考慮類方法和實例方法)

每一個類對象中都一個方法列表,方法列表中記錄著方法名稱、方法實現(xiàn)鬓催、參數(shù)類型,其實selector本質(zhì)就是方法名稱,通過這個方法名稱就可以在方法列表中找到對應(yīng)的方法實現(xiàn).

題庫資料已上傳到 Gitee iOS工程師飛升秘籍肺素,歡迎大家來訪。
? 萬水千山總是情深浮,點贊收藏行不行压怠,還望各位大俠多多支持??

使用runtime Associate方法關(guān)聯(lián)的對象,需要在主對象dealloc的時候釋放么?

無論在MRC下還是ARc下均不需要飞苇。
//對象的內(nèi)存銷毀時間表
1.調(diào)用-release :引用計數(shù)變?yōu)榱?/p>

  • 對象正在被銷毀,生命周期即將結(jié)束.
  • 不能再有新的_weak弱引用,否則將指向nil.*調(diào)用[ self dealloc]

2.子類調(diào)用-dealloc

  • 繼承關(guān)系中最底層的子類在調(diào)用-dealloc
  • 如果是MRC代碼則會手動釋放實例變量們(ivars)*繼承關(guān)系中每一層的父類都在調(diào)用-dealloc

3.NSobject調(diào)用-dealloc

  • 只做一件事:調(diào)用objective-C runtime 中的 object_dispose()方法4.調(diào)用object_dispose()
  • 為C++的實例變量們(ivars)調(diào)用destructors
  • 為ARC 狀態(tài)下的實例變量們(ivars)調(diào)用-release*解除所有使用runtime Associate方法關(guān)聯(lián)的對象
  • 解除所有_weak引用
  • 調(diào)用free()

objc中的類方法和實例方法有什么本質(zhì)區(qū)別和聯(lián)系?

類方法:

  • 類方法是屬于類對象的
  • 類方法只能通過類對象調(diào)用
  • 類方法中的self是類對象
  • 類方法可以調(diào)用其他的類方法
  • 類方法中不能訪問成員變量
  • 類方法中不能直接調(diào)用對象方法

實例方法:

  • 實例方法是屬于實例對象的
  • 實例方法只能通過實例對象調(diào)用
  • 實例方法中的self是實例對象實例方法中可以訪問成員變量
  • 實例方法中直接調(diào)用實例方法
  • 實例方法中也可以調(diào)用類方法(通過類名)方法

runloop和線程有什么關(guān)系?

實際上菌瘫,run loop和線程是緊密相連的,可以這樣說run loop是為了線程而生布卡,沒有線程雨让,它就沒有存在的必要。Run loops是線程的基礎(chǔ)架構(gòu)部分忿等,Cocoa 和CoreFundation 都提供了runloop對象方便配置和管理線程的 run loop(以下都以 cocoa為例)栖忠。每個線程,包括程序的主線程( main thread )都有與之相應(yīng)的run loop對象。

runloop和線程的關(guān)系∶
主線程的run loop默認是啟動的庵寞。
ios的應(yīng)用程序里面狸相,程序啟動后會有一個如下的main()函數(shù)

int main( int argc,_char * argv[]) {
autoreleasepool i
return UIApplicationMain(argc,argv捐川,nil脓鹃,NSStringFromClass([AppDelegate
class]));

重點是UIApplicationMain()函數(shù),這個方法會為main thread設(shè)置一個NSRunLoop對象古沥,這就解釋了∶

  • 為什么我們的應(yīng)用可以在無人操作的時候休息瘸右,需要讓它干活的時候又能立馬響應(yīng)。
  • 對其它線程來說,run loop默認是沒有啟動的岩齿,如果你需要更多的線程交互則可以手動配置

和啟動太颤,如果線程只是去執(zhí)行一個長時間的已確定的任務(wù)則不需要。

  • 在任何一個Cocoa程序的線程中盹沈,都可以通過以下代碼來獲取到當(dāng)前線程的 run loop 龄章。
NSRunLoop *runloop = [ NSRunLoop currentRunLoop];

runloop的mode作用是什么?

model主要是用來指定事件在運行循環(huán)中的優(yōu)先級的,分為:

  • NSDefaultRunLoopMode (kCFRunLoopDefaultMode):默認襟诸,空閑狀態(tài)UlTrackingRunLoopMode: > - > - ScrollView滑動時
  • UlInitializationRunLoopMode:啟動時
  • NSRunLoopCommonModes (kCFRunLoopCommonModes) : Mode集合

蘋果公開提供的Mode有兩個:

  • NSDefaultRunLoopMode (kCFRunLoopDefaultMode)
  • NSRunLoopCommonModes (kCFRunLoopCommonModes)

runloop內(nèi)部是如何實現(xiàn)的?

一般來講瓦堵,一個線程一次只能執(zhí)行一個任務(wù),執(zhí)行完成后線程就會退出歌亲。如果我們需要一個機制菇用,讓線程能隨時處理事件但并不退出,通常的代碼邏輯是這樣的:

function loop(){
initialize();
do {
    var msg = get_next_msg();
    process_msg(msg);
}while (msg !=nil);
}

或使用偽代碼來展示下:


int main( int argc, char * argv[]) {
//程序一直運行狀態(tài)
while (AppIsRunning) {
//睡眠狀態(tài),等待喚醒事件
id whowakesMe = sleepForwakingup();//得到喚醒事件
id event = GetEvent(whowakesMe ) ;//開始處理事件
HandleEvent(event);
}
return 0;
}

objc使用什么機制管理對象內(nèi)存?

通過retaincount 的機制來決定對象是否需要釋放陷揪。每次runloop 的時候惋鸥,都會檢查對象的retainCount,如果retainCount為 e悍缠,說明該對象沒有地方需要繼續(xù)使用了卦绣,可以釋放掉了。

使用block時什么情況會發(fā)生引用循環(huán)飞蚓,如何解決?

一個對象中強引用了block滤港,在block中又強引用了該對象,就會發(fā)生循環(huán)引用趴拧。
解決方法是將該對象使用_weak或者_block修飾符修飾之后再在block中使用溅漾。

  • id weak weakSelf = self;或者 weak __typeof(&*self)weakSelf = self該方法可以設(shè)置宏
  • id _block weakSelf = self;
    或者將其中一方強制置空xxx = nil。

GCD的隊列(dispatch_queue_t)分哪兩種類型?

  • 串行隊列Serial Dispatch Queue
  • 并行隊列Concurrent Dispatch Queue

如何用GCD同步若干個異步調(diào)用?(如根據(jù)若干個url異步加載多張圖片著榴,然后在都下載完成后合成一張整圖)

使用Dispatch Group追加block到Global Group Queue,這些block如果全部執(zhí)行完畢添履,就會執(zhí)行Main Dispatch Queue中的結(jié)束處理的block。

dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT脑又,0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue暮胧,^{/*加載圖片1 */ });
dispatch_group_async(group,queue,^{/*加載圖片2*/ });
dispatch_group_async(group锐借,queue,^{/*加載圖片3*/ });
dispatch_group_notify(group往衷,dispatch_get_main_queue()钞翔,^{
/合并圖片
});

題庫資料已上傳到 Gitee iOS工程師飛升秘籍,歡迎大家來訪席舍。
? 萬水千山總是情嗅战,點贊收藏行不行,還望各位大俠多多支持??

原文地址:https://blog.csdn.net/chenzuoY/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俺亮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疟呐,更是在濱河造成了極大的恐慌脚曾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件启具,死亡現(xiàn)場離奇詭異本讥,居然都是意外死亡,警方通過查閱死者的電腦和手機鲁冯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門拷沸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人薯演,你說我怎么就攤上這事撞芍。” “怎么了跨扮?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵序无,是天一觀的道長。 經(jīng)常有香客問我衡创,道長帝嗡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任璃氢,我火速辦了婚禮哟玷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘一也。我一直安慰自己巢寡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布塘秦。 她就那樣靜靜地躺著讼渊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尊剔。 梳的紋絲不亂的頭發(fā)上爪幻,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天菱皆,我揣著相機與錄音,去河邊找鬼挨稿。 笑死仇轻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奶甘。 我是一名探鬼主播篷店,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼臭家!你這毒婦竟也來了疲陕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤钉赁,失蹤者是張志新(化名)和其女友劉穎蹄殃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體你踩,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡诅岩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了带膜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吩谦。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖膝藕,靈堂內(nèi)的尸體忽然破棺而出式廷,到底是詐尸還是另有隱情,我是刑警寧澤芭挽,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布懒棉,位于F島的核電站,受9級特大地震影響览绿,放射性物質(zhì)發(fā)生泄漏策严。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一饿敲、第九天 我趴在偏房一處隱蔽的房頂上張望妻导。 院中可真熱鬧,春花似錦怀各、人聲如沸倔韭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寿酌。三九已至,卻和暖如春硕蛹,著一層夾襖步出監(jiān)牢的瞬間醇疼,已是汗流浹背硕并。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秧荆,地道東北人倔毙。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像乙濒,于是被迫代替她去往敵國和親陕赃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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