此篇文章爲 2018 年中我還在滴滴時,爲項目組招聘新的 iOS 實習同窗所作,部份內容已不適用,僅供參考。html
如下爲某些同窗的評論,爲了不本文出發點和其它同窗觀點不一樣而浪費雙方時間,把個別評論置頂從新回覆。ios
恕我直言,如今畢業院校稍好一點的、或者在校成績好一點的實習生根本沒人去作iOS的面試
答:恕我直言,如今家庭背景稍好一點的人根本不會去工做的。算法
爲啥要學ios,移動端都混合開發了數組
答:爲啥要用嘴吃飯,如今均可以直接插管流食了,多好~緩存
如下是我列出來的可以幫助你們招到一個 靠譜的iOS實習生 須要掌握的點,再次說明下狀況:多線程
int **a : 指向一個指針的指針,該指針指向一個整數。
int *a[10] : 指向一個有10個指針的數組,每一個指針指向一個整數。
int (*a)[10] : 指向一個有10個整數數組的指針。
int (*a)(int) : 指向一個函數的指針,該函數有一個整數參數,並返回一個整數。
複製代碼
在 OC 中定義一個枚舉有三種作法:併發
NS_ENUM
宏進行定義;NS_OPTIONS
宏進行定義;NS_ENUM
爲定義通用性枚舉,只能單選,NS_OPTIONS
爲定義位移枚舉,可多選。 // 枚舉爲啥要這麼分?由於涉及到是否使用 C++ 模式進行編譯有關。異步
copy
修飾符進行修飾,且不能使用retain
進行修飾,由於retain
只是進行了一次回調,但 block 的內存仍是放在了棧空間中,在棧上的變量隨時會被系統回收,且Block在建立的時候內存默認就已經分配在棧空間中,其自己的做用域限於其建立時,一旦在超出其建立時的做用域以外使用,則會致使程序的崩潰,故使用 copy
修飾,使其拷貝到堆空間中,block 有時還會用到一些本地變量,只有將其 copy 到堆空間中,才能使用這些變量。Computer : NSObject
Mac : Computer
@implementation Mac
NSLog(@"%@", [self class]);
NSLog(@"%@", [super class])
@end
複製代碼
兩者都會輸出Mac。函數
objc_msgSend
函數,其定義爲id objc_msgSend(id self, SEL op, ...)
,第一個參數是Mac實例,但其並沒有-(Class)class
方法,此時去父類Computer中尋找,發現也沒有,再去其父類NSObject
中找,找到了!返回的就是self
其自己,可猜想其方法實現以下:- (Class)class {
return object_getClass(self);
}
複製代碼
objc_msgSendSuper
函數,其定義爲id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
,而struct objc_super
結構體的定義爲:struct objc_super {
__unsafe_unretained id receiver;
__unsafe_unretained Class super_class;
}
複製代碼
因此轉換成objc_msgSendSuper
函數後,第一步要先去構造objc_super
結構體,結構的第一個成員receiver
就是self
,第二個成員是(id)class_getSuperclass(object_getClass("Mac"))
,該函數輸出的結果爲super_class值,即Computer
,第二步,則去Computer
類中去找- (Class)class
,發現並未找到,接着去NSObject中找,找到了!最後是使用了objc_msgSend(objc_super->receiver, @selector(class))
去調用了,這個時候已經跟以前的[self class]調用輸出結果重複了,返回結果仍是Mac
。static NSString *cellID = @"cellID";
防止由於調用次數過多,static保證只建立一次,提升性能(感受性能的提高能夠忽略不記emmm)dequeueReusableCellWithIdentifier:(NSString *)ID
會查詢可重用Cell,若註冊了原型Cell則可以查詢到,不然爲nil,故須要先判斷if(cell == nil)
dequeueReusableCellWithIdentifier:(NSString *)ID indexPath:(NSIndexPath *)indexPath
,使用以前必須經過SB/class進行可重用Cell的註冊(registerNib/registerClass),不須要判斷nil,必定會返回cell,若緩衝區Cell不存在,會使用原型Cell從新實例化一個新Cell。heightForRowAtIndexPath
獲取每一個Cell即將顯示的高度,實際上就是要肯定總的tableView.contenSize,最後才又接着調用cellForRowAtIndexPath
,能夠建一個frame模型,保存下提早計算好的cell高度。ASDK
這個庫進行。static User *user;
+ (User *)shareInstance {
if (user == nil) {
@synchronized(self) {
// 加鎖
user = [User alloc] init];
}
}
return user;
}
+ (User *)shareInstance {
static dispatch_onec_t onecToken;
dispatch_onece(&onceToken, ^{
user = [User alloc] init;
})
return user;
}
複製代碼
總結:再次說明,實際電面過程當中,本套題只可做爲參考,並且在電面過程當中會有追問和等待的過程,因此最佳電面時間爲三十分鐘內最佳,嫌短?記好了!這招的是實習生,並且這仍是電面!!!別學啥大公司的戾氣,一個實習生的電面你要搞一個小時甚至快兩個小時,沒有必要。若是是face to face隨你問一兩個小時,但重點是這是電面!不要把這種「隔空喊話」的面試方式做爲考覈一我的是否具有對應的工做能力的最終標準,除非可以肯定之後的工做方式就是「隔空喊話」和「隔空擼碼」。
也不推薦把本套題中的內容做爲一面,一面應該是做爲了解應聘者的職業情況,基礎水平(也是就是邏輯能力),推薦本套題做爲二面,涵蓋基本的iOS開發基礎知識,並且時間可以較好的把握在三十分鐘內,三面應該側重項目實際狀況,並且最好face to face。四面就HR面了吧,儘可能不要有五面了,太難受了。其實三面是最佳的。
記住!不要套題,而應該是舉一反三,引出其它問題。