iOS底層面試題(上篇)

7月,iOS求職跳槽的相對較少骡尽,能在這個時間段求職的遣妥,
不是被迫,就是對自己的技術(shù)很自信攀细;
針對7月箫踩,特別總結(jié)了一份iOS常見大廠面試題(上);
iOS面試題分為 上、中谭贪、下三部分境钟,方便大家觀看;
請先自己答一答
話不多說俭识;直接上題
本文收錄:公眾號【iOS進階寶典《iOS底層面試題(上篇)》】

1:談?wù)勀銓VC的理解

KVC可以通過key直接訪問對象的屬性慨削,或者給對象的屬性賦值,這樣可以在運行時動態(tài)的訪問或修改對象的屬性

2:iOS項目中引用多個第三方庫引發(fā)沖突的解決方法

可能有很多小伙伴還不太清楚,動靜態(tài)庫的開發(fā)理盆,這里推薦一篇博客:iOS-制作.a靜態(tài)庫SDK和使用.a靜態(tài)庫

如果我們存在三方庫沖突就會保存:duplicate symbol _OBJC_IVAR_$_xxxx in:

目前見效最快的就是把**.framework**選中痘煤,**taggert Membership**的對勾取消掉,就編譯沒有問題了猿规,但是后續(xù)的其他問題可能還會出現(xiàn)

我想說的是像這種開源的使用率很高的源代碼本不應該包含在lib庫中衷快,就算是你要包含那也要改個名字是吧。不過沒辦法現(xiàn)在人家既然包含姨俩,我們就只有想辦法分離了

  • mkdir armv7:創(chuàng)建臨時文件夾

  • lipo libALMovie.a -thin armv7 -output armv7/armv7.a:取出armv7平臺的包

  • ar -t armv7/armv7.a:查看庫中所包含的文件列表

  • cd armv7 && ar xv armv7.a:解壓出object file(即.o后綴文件)

  • rm ALButton.o:找到?jīng)_突的包蘸拔,刪除掉(此步可以多次操作)

  • cd … && ar rcs armv7.a armv7/*.o:重新打包object file

  • 多平臺的SDK的話,需要多次操作第4步环葵。
    操作完成后调窍,合并多個平臺的文件為一個.a文件:
    lipo -create armv7.a arm64.a -output new.a

  • 將修改好的文件, 拖拽到原文件夾下张遭,替換原文件即可邓萨。

3:GCD實現(xiàn)多讀單寫

比如在內(nèi)存中維護一份數(shù)據(jù),有多處地方可能會同時操作這塊數(shù)據(jù)菊卷,怎么能保證數(shù)據(jù)安全缔恳?
這道題目總結(jié)得到要滿足以下三點:

  • 1.讀寫互斥
  • 2.寫寫互斥
  • 3.讀讀并發(fā)
@implementation KCPerson
- (instancetype)init
{
    if (self = [super init]) {
       _concurrentQueue = dispatch_queue_create("com.kc_person.syncQueue", DISPATCH_QUEUE_CONCURRENT);
       _dic = [NSMutableDictionary dictionary];
    }
    return self;
}
- (void)kc_setSafeObject:(id)object forKey:(NSString *)key{
    key = [key copy];
    dispatch_barrier_async(_concurrentQueue, ^{
       [_dic setObject:object key:key];
    });
}
- (id)kc_safeObjectForKey::(NSString *)key{
    __block NSString *temp;
    dispatch_sync(_concurrentQueue, ^{
        temp =[_dic objectForKey:key];
    });
    return temp;
}
@end
  • 首先我們要維系一個GCD 隊列,最好不用全局隊列洁闰,畢竟大家都知道全局隊列遇到柵欄函數(shù)是有坑點的歉甚,這里就不分析了!

  • 因為考慮性能 死鎖 堵塞的因素不考慮串行隊列扑眉,用的是自定義的并發(fā)隊列纸泄!
    _concurrentQueue = dispatch_queue_create("com.kc_person.syncQueue", DISPATCH_QUEUE_CONCURRENT);

  • 首先我們來看看讀操作:kc_safeObjectForKey我們考慮到多線程影響是不能用異步函數(shù)的!說明:

  • 線程2 獲妊亍:
    name 線程3 獲取 age

  • 如果因為異步并發(fā)聘裁,導致混亂 本來讀的是name 結(jié)果讀到了age

  • 我們允許多個任務(wù)同時進去! 但是讀操作需要同步返回,所以我們選擇:同步函數(shù) (讀讀并發(fā))

  • 我們再來看看寫操作耸弄,在寫操作的時候?qū)ey進行了copy, 關(guān)于此處的解釋咧虎,插入一段來自參考文獻的引用:

函數(shù)調(diào)用者可以自由傳遞一個NSMutableStringkey,并且能夠在函數(shù)返回后修改它计呈。因此我們必須對傳入的字符串使用copy操作以確保函數(shù)能夠正確地工作砰诵。如果傳入的字符串不是可變的(也就是正常的NSString類型),調(diào)用copy基本上是個空操作捌显。

  • 這里我們選擇dispatch_barrier_async, 為什么是柵欄函數(shù)而不是異步函數(shù)或者同步函數(shù)茁彭,下面分析:

  • 柵欄函數(shù)任務(wù):之前所有的任務(wù)執(zhí)行完畢,并且在它后面的任務(wù)開始之前扶歪,期間不會有其他的任務(wù)執(zhí)行理肺,這樣比較好的促使 寫操作一個接一個寫 (寫寫互斥)摄闸,不會亂!

  • 為什么不是異步函數(shù)妹萨?應該很容易分析年枕,畢竟會產(chǎn)生混亂!

  • 為什么不用同步函數(shù)乎完?如果讀寫都操作了熏兄,那么用同步函數(shù),就有可能存在:我寫需要等待讀操作回來才能執(zhí)行树姨,顯然這里是不合理摩桶!

4:講一下atomic的實現(xiàn)機制;為什么不能保證絕對的線程安全(最好可以結(jié)合場景來說)帽揪?

A: atomic的實現(xiàn)機制

  • atomicproperty的修飾詞之一硝清,表示是原子性的,使用方式為@property(atomic)int age;此時編譯器會自動生成 getter/setter 方法转晰,最終會調(diào)用objc_getPropertyobjc_setProperty方法來進行存取屬性芦拿。

  • 若此時屬性用atomic修飾的話,在這兩個方法內(nèi)部使用os_unfair_lock 來進行加鎖挽霉,來保證讀寫的原子性防嗡。鎖都在PropertyLocks 中保存著(在iOS平臺會初始化8個变汪,mac平臺64個)侠坎,在用之前,會把鎖都初始化好裙盾,在需要用到時实胸,用對象的地址加上成員變量的偏移量為key,去PropertyLocks中去取番官。因此存取時用的是同一個鎖庐完,所以atomic能保證屬性的存取時是線程安全的。

  • 注:由于鎖是有限的徘熔,不用對象门躯,不同屬性的讀取用的也可能是同一個鎖

B: atomic為什么不能保證絕對的線程安全?

  • atomicgetter/setter方法中加鎖酷师,僅保證了存取時的線程安全讶凉,假設(shè)我們的屬性是@property(atomic)NSMutableArray *array;可變的容器時,無法保證對容器的修改是線程安全的.
  • 在編譯器自動生產(chǎn)的getter/setter方法,最終會調(diào)用objc_getPropertyobjc_setProperty方法存取屬性山孔,在此方法內(nèi)部保證了讀寫時的線程安全的懂讯,當我們重寫getter/setter方法時,就只能依靠自己在getter/setter中保證線程安全

5. Autoreleasepool所使用的數(shù)據(jù)結(jié)構(gòu)是什么台颠?AutoreleasePoolPage結(jié)構(gòu)體了解么褐望?

  • Autoreleasepool是由多個AutoreleasePoolPage以雙向鏈表的形式連接起來的.

  • Autoreleasepool的基本原理:在每個自動釋放池創(chuàng)建的時候,會在當前的AutoreleasePoolPage中設(shè)置一個標記位,在此期間瘫里,當有對象調(diào)用autorelsease時实蔽,會把對象添加 AutoreleasePoolPage

  • 若當前頁添加滿了,會初始化一個新頁谨读,然后用雙向量表鏈接起來盐须,并把新初始化的這一頁設(shè)置為hotPage,當自動釋放池pop時,從最下面依次往上pop漆腌,調(diào)用每個對象的release方法贼邓,直到遇到標志位。

AutoreleasePoolPage結(jié)構(gòu)如下

class AutoreleasePoolPage {
    magic_t const magic;
    id *next;//下一個存放autorelease對象的地址
    pthread_t const thread; //AutoreleasePoolPage 所在的線程
    AutoreleasePoolPage * const parent;//父節(jié)點
    AutoreleasePoolPage *child;//子節(jié)點
    uint32_t const depth;//深度,也可以理解為當前page在鏈表中的位置
    uint32_t hiwat;
}

文末推薦:iOS熱門文集

① Swift

② iOS底層技術(shù)

③ iOS逆向防護

④ iOS面試合集

喜歡的小伙伴記得點贊喔~

收藏等于白嫖闷尿,點贊才是真情?( ′???` )?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塑径,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子填具,更是在濱河造成了極大的恐慌统舀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劳景,死亡現(xiàn)場離奇詭異誉简,居然都是意外死亡,警方通過查閱死者的電腦和手機盟广,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門闷串,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筋量,你說我怎么就攤上這事烹吵。” “怎么了桨武?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵肋拔,是天一觀的道長。 經(jīng)常有香客問我呀酸,道長凉蜂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任性誉,我火速辦了婚禮窿吩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘艾栋。我一直安慰自己爆存,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布蝗砾。 她就那樣靜靜地躺著先较,像睡著了一般携冤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闲勺,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天曾棕,我揣著相機與錄音,去河邊找鬼菜循。 笑死翘地,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的癌幕。 我是一名探鬼主播衙耕,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勺远!你這毒婦竟也來了橙喘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胶逢,失蹤者是張志新(化名)和其女友劉穎厅瞎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體初坠,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡和簸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碟刺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锁保。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖南誊,靈堂內(nèi)的尸體忽然破棺而出身诺,到底是詐尸還是另有隱情,我是刑警寧澤抄囚,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站橄务,受9級特大地震影響幔托,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜂挪,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一重挑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棠涮,春花似錦谬哀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谦屑。三九已至,卻和暖如春篇梭,著一層夾襖步出監(jiān)牢的瞬間氢橙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工恬偷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悍手,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓袍患,卻偏偏與公主長得像坦康,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诡延,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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

  • from 邏輯教育第一部分:iOS面試題(上)1: 談?wù)勀銓VC的理解2: iOS項目中引用多個第三方庫引發(fā)沖突...
    經(jīng)天緯地閱讀 4,559評論 0 3
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,146評論 30 470
  • 點贊再看涝焙,養(yǎng)成習慣,白嫖不好孕暇,歡迎大家關(guān)注我面試小專欄 : iOS中高級進階之路 有我準備的一線大廠面試資料和簡歷...
    iOS弗森科閱讀 4,309評論 1 35
  • 前段時間更新了一篇 給iOS中高級面試官的一份招聘要求收到很多小伙伴的點贊與關(guān)注妖滔∷硐可能有很多小伙伴已經(jīng)帶著我在那篇...
    iOS鑫閱讀 673評論 0 10
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭座舍,有人歡樂有人憂愁沮翔,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53