比較好的面試題(經(jīng)常更新)

15年騰訊iOS面試題
  1. autorelease 嵌套既琴, 系統(tǒng)是怎么處理的荸型?
    在`NSAutoReleasePool`中會有一個array保存所有需要被`autorelease`的對象虱疏, 由于我們要確保在保存對象時array不會對該對象進行強引用(retainCount plus 1), 我們需要用CFMutableArrayRef.
    由于每一個線程都有自己的autoReleasePool, 所以我們需要保存該線程中所創(chuàng)建的所有autoreleasepools乌询,每創(chuàng)建一個autoreleasepool, 我們可以把它放入一個stack里背蟆,然后將這個stack保存起來 這里可以使用:

    NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
    NSString *key = @"com.my.thread-local.releasepool";
    CFMutableArrayRef stack = threadDict[key];
    if (!stack) {
       stack = CFArrayCreateMutable(NULL, 0, NULL);
       [threadDict setObject:(id)stack forKey:key];
    }
    

    dealloc的時候,首先遍歷當前autoReleasePool里所有對象劣砍,發(fā)送release, 然后release保存所有對象的CFMutableArray (CFRelease(_objects)). 然后遍歷保存在thread里的stack惧蛹,由于我們將所有在該線程內(nèi)創(chuàng)建的autoreleasepool都存入這個stack里,我們只需要release所有在self之后的出現(xiàn)的autoreleasepool, 然后把self從stack里移除。由于每一個autoreleasepool都遵從這樣的邏輯香嗓,這其實就是一個遞歸的調(diào)用迅腔。

  2. ARC 原理
    ARC (Automatic Reference Counting), 在對象被創(chuàng)建時,ARC會保存一大堆關(guān)于該對象的信息:對象類型靠娱,所有的屬性等等沧烈,當我們不再需要該對象的時候,ARC會幫助我們銷毀該對象像云。
    當我們alloc``init一個對象實例時锌雀,編譯器會在該實例使用完后插入objc_release去銷毀該對象。如果我們是在使用properties的時候迅诬,該property的getter會被寫成:

    - (Test *)test {
      return objc_retainAutoreleaseReturnValue(_test);
    }
    

    可以看到汤锨,所有的properties都被retain/autorelease了, 當引用properties時百框,編譯器還會將caller改寫為:objc_retainAutoreleaseReturnValue([self test]). 這里出現(xiàn)了兩次的retain/autorelease,而編譯器會優(yōu)化的只使用一次牍汹。

  3. MRC 和 ARC怎么破循環(huán)引用(retain cycle)
    使用__weak__unsafe_unretained

  4. 線程安全
    不知道要問什么铐维,問lock?還是其他慎菲?lock的話有:NSLock, OSSpinLock, NSRecursiveLock, pthread_mutex_t. 我們還可以用serial dispatch_queue_t來作lock嫁蛇。還有dispatch_barrier也可以。至于用哪個露该,就要具體分析了睬棚。

  5. NSOperation可不可以停止
    調(diào)用cancel方法可以將NSOperationQueue當前狀態(tài)設(shè)為cancelled,在operation運行中我們要不斷的檢查當前的operationQueue的狀態(tài)解幼,看isCancelled返回是否為真抑党,若為真,則立刻結(jié)束operation.

  6. HTTP狀態(tài)碼撵摆,自己寫http框架底靠,緩存,異步特铝,并發(fā)高性能的解決方案
    根據(jù)我的經(jīng)驗暑中,用過的HTTP狀態(tài)碼有: 200 OK, 201 Created, 302 Redirect, 304 Not Modified, 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 408 Request Time out, 500 Internal Error, 503 Server Not Available。網(wǎng)上能找到全部的狀態(tài)碼鲫剿,但個人覺得記住一些常用的就足夠了鳄逾,當碰到特殊情況要使用其他狀態(tài)碼,查資料就好了灵莲。

    對于http框架雕凹,在ios中,通常通過封裝NSURLSession來完成網(wǎng)絡(luò)層的開發(fā),主要注意的是網(wǎng)絡(luò)層應(yīng)獨立请琳,只完成與后臺API的通信粱挡,把數(shù)據(jù)處理或其他與網(wǎng)絡(luò)通信無關(guān)的內(nèi)容分離開來。
    緩存俄精,除非有特殊要求询筏,個人建議還是使用NSURLCache或者NSCache來完成。如果服務(wù)器支持的話竖慧,應(yīng)該好好利用304狀態(tài)碼的特性嫌套,這樣會節(jié)省流量,而且網(wǎng)絡(luò)響應(yīng)會快些圾旨。
    異步這個我覺得不用多說了吧踱讨?NSURLSession都是異步的。
    對于并發(fā)高性能:需要知道的是砍的,NSURLSession在iOS中最多可以有4個tasks同時運行痹筛,所以應(yīng)該復(fù)用所創(chuàng)建的NSURLSession, 在它之上創(chuàng)建不同的tasks。如果像是tableview中加載圖片廓鞠,可以創(chuàng)建一個隊列(queue), 如果tasks超過4個帚稠,把超過的放入這個隊列中,當之前的任務(wù)完成時床佳,檢查隊列中有沒有等待的滋早,如果有,把它們從隊列中取出來砌们,然后[task resume]杆麸。

  7. 斷點續(xù)傳方案
    可使用NSURLSession來完成. 主要通過以下的方法

    - (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler;
    - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData;
    

    如果不是使用NSURLSession, 則要麻煩一些,首先必需在暫停時記錄下當前已接收的文件長度浪感,在下一次開始時設(shè)置HTTP header里的Range

    NSString *range = [NSString stringWithFormat:@"bytes=%lld-", self.receivedLength];
    [request setValue:range forHTTPHeaderField:@"Range"];
    
  8. UI, 動畫優(yōu)化昔头, UITableViewCell優(yōu)化
    UI, 動畫優(yōu)化要根據(jù)實際情況以及profiling的結(jié)果來進行具體分析,光這樣問還真不知道該怎么回答影兽。
    UITableViewCell的優(yōu)化也是如此减细,但是一般的套路是profiling, 盡量少加subviews, 減少off-screen rendering, 比如圓角圖片,可以在下載圖片時在后臺直接畫圓角在圖片中赢笨。下載圖片時盡量使用caching未蝌。在加載數(shù)據(jù)時,盡量減少數(shù)據(jù)處理的時間茧妒,盡量不要fetching core data 等等萧吠。

  9. 本地數(shù)據(jù)庫海量數(shù)據(jù)如何提高查詢效率和存儲效率
    在ios中存儲數(shù)據(jù)基本上就是plist, sqlite 和core data (NSUserDefault其實也是plist), plist建議用在存儲簡單而且數(shù)據(jù)量不大的情況桐筏,而且對于查詢沒有太多要求的纸型。sqlite可以高效的查詢和存儲數(shù)據(jù),但是缺點是:C API, 要自己做封裝,而且每次都需要讀寫硬盤狰腌,對數(shù)據(jù)變化不敏感除破,要手動更新界面從而反應(yīng)數(shù)據(jù)中的變化
    在iOS開發(fā)中,除非有特殊需求琼腔,一般都建議使用Core Data.

    如何提高查詢效率:

    1. 設(shè)置合適的index.
    2. 優(yōu)化predicate瑰枫,對于string類型,盡量不要使用==
    3. 使用batchSize
    4. 合理使用batchLimit
    5. 對于需要用到的relationship objects,可以使用setRelationshipKeyPathsForPrefetching來減少Faulting overhead.
    6. 可以使用batchFaulting來減少Faulting overhead

    如何提高存儲效率:

    1. 盡量避免在main thread中寫數(shù)據(jù)
    2. 不要在Core Data中保存圖片丹莲,文件等數(shù)據(jù)
    3. 對于刪除光坝,更新,盡量batch
    4. 注意調(diào)用[NSManagedObjectContext save:]的時機甥材,盡量是由在后臺運行的NSManagedObjectContext來完成寫入盯另。
  10. 索引的缺點

    1. 需要空間儲存索引
    2. 創(chuàng)建和維護索引需要耗費時間
    3. 當刪除,插入和更新數(shù)據(jù)是洲赵,索引也需要進行更新鸳惯,這樣降低了寫數(shù)據(jù)的速度。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叠萍,一起剝皮案震驚了整個濱河市芝发,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俭令,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件部宿,死亡現(xiàn)場離奇詭異抄腔,居然都是意外死亡,警方通過查閱死者的電腦和手機理张,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門赫蛇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雾叭,你說我怎么就攤上這事悟耘。” “怎么了织狐?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵暂幼,是天一觀的道長。 經(jīng)常有香客問我移迫,道長旺嬉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任厨埋,我火速辦了婚禮邪媳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己雨效,他們只是感情好迅涮,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徽龟,像睡著了一般叮姑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顿肺,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天戏溺,我揣著相機與錄音,去河邊找鬼屠尊。 笑死旷祸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的讼昆。 我是一名探鬼主播托享,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浸赫!你這毒婦竟也來了闰围?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤既峡,失蹤者是張志新(化名)和其女友劉穎羡榴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體运敢,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡校仑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了传惠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迄沫。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卦方,靈堂內(nèi)的尸體忽然破棺而出羊瘩,到底是詐尸還是另有隱情,我是刑警寧澤盼砍,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布尘吗,位于F島的核電站,受9級特大地震影響浇坐,放射性物質(zhì)發(fā)生泄漏摇予。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一吗跋、第九天 我趴在偏房一處隱蔽的房頂上張望侧戴。 院中可真熱鬧宁昭,春花似錦、人聲如沸酗宋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜕猫。三九已至寂曹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間回右,已是汗流浹背隆圆。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翔烁,地道東北人渺氧。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像蹬屹,于是被迫代替她去往敵國和親侣背。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評論 29 470
  • 1.OC里用到集合類是什么慨默? 基本類型為:NSArray贩耐,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,363評論 0 3
  • 1.2017年iOS面試題總結(jié) 寫的不錯: http://www.reibang.com/p/f9eb6b315...
    紫色冰雨閱讀 192評論 0 1
  • 序言 目前形勢,參加到iOS隊伍的人是越來越多厦取,甚至已經(jīng)到供過于求了潮太。今年,找過工作人可能會更深刻地體會到今年的就...
    恒愛DE問候閱讀 5,330評論 0 9
  • OC的理解與特性 OC作為一門面向?qū)ο蟮恼Z言虾攻,自然具有面向?qū)ο蟮恼Z言特性:封裝铡买、繼承、多態(tài)台谢。它既具有靜態(tài)語言的特性...
    克魯?shù)吕?/span>閱讀 446評論 0 0