雖然前面已經(jīng)分享過比較多的面試題啄寡,但是最近很多人給我反應(yīng)還在找工作土全。
我想還是再總結(jié)一下關(guān)于面試的一些資料吧报嵌。
一.筆試題
筆試基本都有一兩道基礎(chǔ)題旷祸,比如說UITableView的重用機制糜颠,ARC的基本原理汹族,如何避免retain cycle,談?wù)剬VC的理解其兴,iOS內(nèi)存管理機制顶瞒、WebView與JS交互、安全機制元旬。這些大家應(yīng)該都很清楚了榴徐。筆試的內(nèi)容有幾種有選擇題,問答題匀归,難一點的就是多選題了坑资。我朋友面試了一家就是給了10道多選題,多選穆端,少選袱贮,錯選都不行,他說當(dāng)時做完以后就感覺不是很好体啰,有些題目題干就是一下哪些是對的攒巍,然后ABCD依次給4個不同的概念,這種一道題相當(dāng)于考了4個點荒勇∑饫颍總之遇到這種“惡心”的多選題也不要太慌,靜下心來一一甄別應(yīng)該能拿到不錯的成績沽翔。
下面這份面試清單請收下
上面的面試清單完全是小插曲
接下來說幾個答的不怎么好的題目兢孝,朋友當(dāng)時記了一下,和大家分享一下。
1.進程和線程的區(qū)別和聯(lián)系
朋友說西潘,這個其實是操作系統(tǒng)的問題卷玉,當(dāng)時一下子把他問的懵了,后來仔細回想了一下喷市,加上自己的理解就答了相种,下面說說稍微完整的答案,大家可以準備準備品姓,再問這種問題就可以完美作答了寝并。
進程是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位.。線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源腹备。
一個線程可以創(chuàng)建和撤銷另一個線程衬潦;同一個進程中的多個線程之間可以并發(fā)執(zhí)行。
2.并行和并發(fā)的區(qū)別
并行是指兩個或者多個事件在同一時刻發(fā)生植酥;
并發(fā)是指兩個或多個事件在同一時間間隔內(nèi)發(fā)生镀岛。
3.談?wù)勀銓lock和delegate的理解
他當(dāng)時是這么答的,delegate的回調(diào)更多的面向過程友驮,而block則是面向結(jié)果的漂羊。如果你需要得到一條多步進程的通知,你應(yīng)該使用delegation卸留。而當(dāng)你只是希望得到你請求的信息(或者獲取信息時的錯誤提示)走越,你應(yīng)該使用block。(如果你結(jié)合之前的3個結(jié)論耻瑟,你會發(fā)現(xiàn)delegate可以在所有事件中維持state旨指,而多個獨立的block卻不能)
4.談?wù)?b>instancetype和id的異同
1、相同點
都可以作為方法的返回類型
2喳整、不同點
①instancetype可以返回和方法所在類相同類型的對象谆构,id只能返回未知類型的對象;②instancetype只能作為返回值算柳,不能像id那樣作為參數(shù)
5.category中能不能使用聲明屬性低淡?為什么?如果能瞬项,怎么實現(xiàn)蔗蹋?
這種問題一問,我當(dāng)時就感覺肯定能實現(xiàn)的囱淋,但是實在不知道怎么做猪杭,后來回來查了一下,才知道是用到了Runtime的知識了妥衣。貼一下答案
給分類(Category)添加屬性
利用Runtime實現(xiàn)getter/setter 方法
@interface ClassName (CategoryName)@property (nonatomic, strong) NSString *str;@end//實現(xiàn)文件#import "ClassName + CategoryName.h"#importstatic void *strKey = &strKey;
@implementation ClassName (CategoryName)
-(void)setStr:(NSString *)str
{
? ? objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);
}
-(NSString *)str
{
? ? return objc_getAssociatedObject(self, &strKey);
}
@end
6.isKindOfClass和isMemberOfClass的區(qū)別
這個題目簡單皂吮,但是就是當(dāng)時緊張的情況下戒傻,別答反了。
isKindOfClass來確定一個對象是否是一個類的成員蜂筹,或者是派生自該類的成員
isMemberOfClass只能確定一個對象是否是當(dāng)前類的成員
7.block里面的如何防止retain cycle
使用弱引用打斷block里面的retain cycle
MRC中?_block?是不會引起retain需纳;但在ARC中?_block?則會引起retain。ARC中應(yīng)該使用?_weak或__unsafe_unretained弱引用
8.iOS多線程有哪幾種實現(xiàn)方法艺挪?GCD中有哪些隊列不翩?分別是并行還是串行?
iOS中多線程編程工具主要3有:
1.NSThread
2.NSOperation
3.GCD
dispatch queue分為下面3種:而系統(tǒng)默認就有一串行隊列main_queue和并行隊列g(shù)lobal_queue:
GCD中有三種隊列類型:
The main queue:與主線程功能相同麻裳。實際上口蝠,提交至main queue的任務(wù)會在主線程中執(zhí)行。main queue可以調(diào)用dispatch_get_main_queue()來獲得津坑。因為main queue是與主線程相關(guān)的妙蔗,所以這是一個串行隊列。
Global queues:全局隊列是并發(fā)隊列疆瑰,并由整個進程共享眉反。進程中存在三個全局隊列:高、中(默認)乃摹、低三個優(yōu)先級隊列禁漓「疲可以調(diào)用dispatch_get_global_queue函數(shù)傳入優(yōu)先級來訪問隊列孵睬。
用戶隊列:用戶隊列 (GCD并不這樣稱呼這種隊列, 但是沒有一個特定的名字來形容這種隊列,所以我們稱其為用戶隊列) 是用函數(shù) dispatch_queue_create
創(chuàng)建的隊列伶跷,這些隊列是串行的掰读。正因為如此,它們可以用來完成同步機制, 有點像傳統(tǒng)線程中的mutex叭莫。
9.談?wù)凬SString的時候用copy和strong的區(qū)別蹈集?
這個題目當(dāng)時問出來,真的是一下子就傻了雇初,平時雖然用的多拢肆,但是真的沒有注意比較過他們倆,看來平時學(xué)習(xí)還是多要問問所以然靖诗!
10.Core Data是數(shù)據(jù)庫么郭怪?有哪些重要的類?
感覺應(yīng)該不是常理的刊橘,當(dāng)時仔細想了想鄙才,Core Data確實不是一個數(shù)據(jù)庫,只是把表和OC對象進行的映射促绵,當(dāng)時并不是進進映射那么簡單攒庵,底層還是用的Sqlite3進行存儲的嘴纺,所以Core Data不是數(shù)據(jù)庫。
有以下6個重要的類:
(1)NSManagedObjectContext(被管理的數(shù)據(jù)上下文)
操作實際內(nèi)容(操作持久層)
作用:插入數(shù)據(jù)浓冒,查詢數(shù)據(jù)栽渴,刪除數(shù)據(jù)
(2)NSManagedObjectModel(被管理的數(shù)據(jù)模型)
數(shù)據(jù)庫所有表格或數(shù)據(jù)結(jié)構(gòu),包含各實體的定義信息
作用:添加實體的屬性稳懒,建立屬性之間的關(guān)系
操作方法:視圖編輯器熔萧,或代碼
(3)NSPersistentStoreCoordinator(持久化存儲助理)
相當(dāng)于數(shù)據(jù)庫的連接器
作用:設(shè)置數(shù)據(jù)存儲的名字,位置僚祷,存儲方式佛致,和存儲時機
(4)NSManagedObject(被管理的數(shù)據(jù)記錄)
相當(dāng)于數(shù)據(jù)庫中的表格記錄
(5)NSFetchRequest(獲取數(shù)據(jù)的請求)
相當(dāng)于查詢語句
(6)NSEntityDescription(實體結(jié)構(gòu))
相當(dāng)于表格結(jié)構(gòu)
以上是我朋友3月份面試遇到的問到的一下子沒有答全或者沒答好的問題,大神全部都會的話請忽略哈辙谜。然后還有2個開放性的問題俺榆,那基本就是完全考驗實力和自己理解的深度了。一個是談?wù)勀銓untime的理解装哆,另一個是談?wù)勀銓unloop的理解罐脊,由于我個人這兩個理解都不是很深,這里就不貼我的理解了蜕琴。大家如果也感覺欠缺的萍桌,就趕緊去網(wǎng)上多看看吧!
10凌简,sprintf,strcpy,memcpy使用上有什么要注意的地方
二.機試
這個環(huán)節(jié)基本都是大公司上炎,或者是復(fù)試的時候會出現(xiàn),因為上機打代碼確實很很快區(qū)分出誰好誰壞雏搂,他面了一家這樣的公司藕施,就給一張白紙,全程都是手寫代碼凸郑,這就完全是考驗基本功了裳食,因為沒了代碼補全,沒有了編譯器告訴你哪里錯了芙沥,一切都要靠自己的基本功來了诲祸。
機試基本就是靠靠算法題了。當(dāng)然也有算法題在筆試的最后幾道題出現(xiàn)而昨,那就看公司面試怎么安排的救氯。
2年前我也是面試iOS,當(dāng)時對算法和 數(shù)據(jù)結(jié)構(gòu)要求很低的配紫,很多面試基本都不問這些径密,今年面試多了這些問題,也讓我眼前一亮躺孝,也感嘆享扔,2年技術(shù)發(fā)展之快底桂,面試如今都會涉及到算法,不會算法和數(shù)據(jù)結(jié)構(gòu)的程序員的道路會越走越窄惧眠。
算法題籽懦,畢竟不是BAT那種公司,簡單的就是直接要你寫一個算法出來氛魁,稍微高級點的就是有一個背景暮顺,然后要你解決問題,其實就是和ACM題目一樣的秀存,不過就是沒有那么復(fù)雜捶码。我貼幾段問的最多的算法,太難的題只能考自己的算法功底了或链。
二分查找 θ(logn)
遞歸方法
int binarySearch1(int a[] , int low , int high , int findNum)
{? ?
? ? ? int mid = ( low + high ) / 2;? ? ?
? ? ? if (low > high)? ? ? ?
? ? ? ? ? ? return -1;?
? ?? else?
? ?? {? ? ? ?
? ? ? ? ? ? ? if (a[mid] > findNum)? ? ? ? ?
? ? ? ? ? ? ? ? ? ? return binarySearch1(a, low, mid - 1, findNum);? ? ? ?
? ? ? ? ? ? ? else if (a[mid] < findNum)? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? return binarySearch1(a, mid + 1, high, findNum);? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? else? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? return mid;?
? ? }
}
非遞歸方法
int binarySearch2(int a[] , int low , int high , int findNum)
{? ?
? ? ?? while (low <= high)
? ? ? {
? ? ? ? ? ? int mid = ( low + high) / 2;?? //此處一定要放在while里面
? ? ? ? ? ? if (a[mid] < findNum)? ? ? ? ?
? ? ? ? ? ? ? ? low = mid + 1;? ? ? ?
? ? ? ? ? ? else if (a[mid] > findNum)? ? ? ? ? ?
? ? ? ? ? ? ? ? high = mid - 1;? ? ?
? ? ? ? ? ?? else? ? ? ? ?
? ? ? ? ? ? ? ? return mid;? ?
? ? }? ? ?
? ? return? -1;
}
冒泡排序?? θ(n^2)
void bubble_sort(int a[], int n)
{
? ? int i, j, temp;
? ? for (j = 0; j < n - 1; j++)
? ? ? ? for (i = 0; i < n - 1 - j; i++) //外層循環(huán)每循環(huán)一次就能確定出一個泡泡(最大或者最斜鼓铡),所以內(nèi)層循環(huán)不用再計算已經(jīng)排好的部分
? ? ? ? {
? ? ? ? ? ? if(a[i] > a[i + 1])
? ? ? ? ? ? {
? ? ? ? ? ? ? ? temp = a[i];
? ? ? ? ? ? ? ? a[i] = a[i + 1];
? ? ? ? ? ? ? ? a[i + 1] = temp;
? ? ? ? ? ? }
? ? ? ? }
}
快速排序? 調(diào)用方法? quickSort(a,0,n);? θ(nlogn)
void quickSort (int a[] , int low , int high)
{
? ? if (high < low + 2)
? ? ? ? return;
? ? int start = low;
? ? int end = high;
? ? int temp;
? ? while (start < end)
? ? {
? ? ? ? while ( ++start < high && a[start] <= a[low]);//找到第一個比a[low]數(shù)值大的位子start
? ? ? ? while ( --end? > low? && a[end]? >= a[low]);//找到第一個比a[low]數(shù)值小的位子end
? ? ? ? //進行到此澳盐,a[end] < a[low] < a[start],但是物理位置上還是low < start < end祈纯,因此接下來交換a[start]和a[end],于是[low,start]這個區(qū)間里面全部比a[low]小的,[end,hight]這個區(qū)間里面全部都是比a[low]大的
? ? ? ? if (start < end)
? ? ? ? {
? ? ? ? ? ? temp = a[start];
? ? ? ? ? ? a[start]=a[end];
? ? ? ? ? ? a[end]=temp;
? ? ? ? }
? ? ? ? //在GCC編譯器下叼耙,該寫法無法達到交換的目的腕窥,a[start] ^= a[end] ^= a[start] ^= a[end];編譯器的問題
? ? }
? ? //進行到此,[low,end]區(qū)間里面的數(shù)都比a[low]小的,[end,higt]區(qū)間里面都是比a[low]大的筛婉,把a[low]放到中間即可
? ? //在GCC編譯器下簇爆,該寫法無法達到交換的目的,a[low] ^= a[end] ^= a[low] ^= a[end];編譯器的問題
? ? temp = a[low];
? ? a[low]=a[end];
? ? a[end]=temp;
? ? //現(xiàn)在就分成了3段了倾贰,由最初的a[low]樞紐分開的
? ? quickSort(a, low, end);
? ? quickSort(a, start, high);
}
注釋我也寫上了冕碟,這些算法基本上簡單的算法題都能應(yīng)對了。
數(shù)據(jù)結(jié)構(gòu)的題目我就遇到了鏈表翻轉(zhuǎn)匆浙,實現(xiàn)一個棧的結(jié)構(gòu),先進后出的厕妖,樹先跟首尼,中跟,后跟遍歷言秸,圖的DFS和BFS软能。代碼就不貼了,太長了举畸。如果有忘記的查排,可以再去翻翻回顧一下。
三.面試
面試基本都是問你之前做過什么項目啦抄沮,遇到了哪些問題了跋核,自己如何解決的岖瑰。談?wù)剬XX的看法等等這些問題,只要平時認真完成項目砂代,其實面試反而問的東西更好答蹋订,因為都是關(guān)于你項目的,這些你最了解和清楚了刻伊。
好了露戒,到此就是2018年2月上海地區(qū)除了BAT公司,招聘iOS開發(fā)工程師的行情了捶箱,比2年前智什,最大的體會就是面試面更廣了,要求更高了《∈海現(xiàn)在要求除了會OC撩鹿,還要懂算法和數(shù)據(jù)結(jié)構(gòu),還有要么會ReactNative悦屏,或者PhoneGap一系列混合開發(fā)的框架节沦,或者熟悉Swift,程序員要一直跟上主流才能不能被時代淘汰础爬。才能具有競爭力甫贯。活到老學(xué)到老看蚜!最后希望大家都和我交流交流叫搁,我也是個iOS菜鳥,請大家多多指教供炎!
(其實做為一個開發(fā)者渴逻,有一個學(xué)習(xí)的氛圍跟一個交流圈子特別重要,這是一個我的iOS學(xué)習(xí)交流群605315994音诫,不管你是小白還是大牛歡迎入駐惨奕,大家一起交流學(xué)習(xí),加群私聊群主就可以領(lǐng)取2018最全梳理的面試寶典和資料)就是下圖這份資料,希望你能找到理想中的工作竭钝。
著作權(quán)歸作者所有梨撞。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處香罐。