本文是對觀看sunnyxx(孫源)大神直播寫的記錄,加強自己的記憶,也希望對同行們有所幫助
關于簡歷方面
1、項目描述過于簡單寬泛
項目規(guī)模?你在其中的職責?詳細介紹使用的技術棧?遇到的挑戰(zhàn)以及如和解決的?
2、專業(yè)技能千篇一律
在列舉技術名詞的時候最好寫出用這個技術干了什么。比如“熟練運用
objc runtime,曾使用它做了ViewController進入和退出時的AOP埋點”
3、格式、拼寫、細節(jié)
Object-C//這個我相信沒人知道是啥寫全時最好的 Objective-C
Foudation//拼寫錯誤
ios/IOS/Ios//iOS這樣更好
AFNetWorking//networking是一個單詞不需要駝峰
xcode/Xcode//第二個肯定更正確
4、需要提供更多的信息來體現(xiàn)你的特別
Blog GitHup
技術探索
對技術的個人理解以及做過什么有意思的事
5、謙虛、真實
寫最真實的簡歷,這個還是很重要的吧
面試套路
這一塊也是根據(jù)面試官不同而又差異性。列舉幾個
1、最近的工作經(jīng)歷,做了什么App,拿出來玩一玩。詢問面試者負責的是哪一部分。
2、找面試者最熟悉的業(yè)務。描述大概的設計結構,UI層級,交互效果,布局等(考察基本業(yè)務能力,熟練程度,質量)
3、考察基礎問題。如內(nèi)存基礎,多線程等。答的可以會深挖。
4、很厲害了了就會問一些高級的問題,涉及到底層原理這些。
建議:
- 不會的問題可以猜一下,不要陷入無限的思考和一本正經(jīng)的胡說八道。也可以當場請求面試官,學一下。
- 保持溝通順暢
- 保持謙虛,不要裝x
幾個iOS面試題
//@property能使用哪些關鍵字及作用是什么
//下面四種寫法有什么區(qū)別?
@property(nonatomic, strong)NSArray *array0;
@property(nonatomic, copy) NSArray *array1;
@property(nonatomic, strong)NSMutableArray *array2;
@property(nonatomic, copy) NSMutableArray *array3;
//可使用的關鍵字:
strong:強引用,增加對象的引用計數(shù)。會引起外界對象改變導致自己也會改變
copy:復制對象,防止外界對象改變對自己進行改變
weak:弱引用。對象消失后會將指針指向nil
assign:簡單賦值。一般用于基礎類型數(shù)據(jù)
//區(qū)別:
第一種跟第二種的寫法,一般采用第二種。因為如果外界的對象對屬性賦值后,如果使用strong修飾那么屬性值也會更該,相反copy修飾不會。
第三種跟第四種寫法也是采用第三種。因為可變對象用copy修飾后會變?yōu)椴豢勺儗ο螅@時再寫不可變方法就會crash。
基本內(nèi)存管理
//下面對象分別都在什么時候釋放
- (void)ARCProblem {
id obj0 = @"sunnuyxx";
__weak id obj1 = obj0;
id obj2 = [NSObject new];
__weak id obj3 = [NSObject new];
{
id obj4 = [NSObject new];
}
__autoreleasing id obj5 = [NSObject new];
__unsafe_unretained id obj6 = self;
}
//解答
obj0:一直在,常量區(qū)
obj1:不會釋放跟0有關
obj2:用完obj2就會釋放
obj3:本行結束之后就沒了
obj4:在區(qū)域結束時結束
obj5:自動釋放池
obj6:該修飾詞不會做任何操作,不知道什么時候釋放
UIViewcontroller
//這樣寫會發(fā)生什么?
- (void)viewDidLoad{
[super viewDidLoad];
self.view = nil;
}
//很可能發(fā)生遞歸,不是很確定。大家可以自己測試一下
關于UITableViewDataSource 和UITableViewDelegate的主要方法還有調用順序。
這個我們自己測試一下就好了。
block內(nèi)存管理
//如何解決下面代碼問題
-(void)blockRetainCycleProblem{
self.block = ^{
NSLog(@"%@",@[self]);
};
}//循環(huán)引用。block跟self相互持有,如果這里不是self的block就不會出問題
//解決方法
-(void)blockRetainCycleProblem{
__ weak typeof(self) weakSelf = self;
self.block = ^{
NSLog(@"%@",@[weakSelf]);
};
}//這是我經(jīng)常寫的方法
-(void)blockRetainCycleProblem{
__ weak typeof(self) weakSelf = self;
self.block = ^{
__ strong typeof(weakSelf) strongSelf = weakSelf;
NSLog(@"%@",@[strongSelf]);
};
}//第二種
-(void)blockRetainCycleProblem
{
__ weak typeof(self) weakSelf = self;
self.block = ^{
__ strong typeof(weakSelf) strongSelf = weakSelf;
if(strongSelf)
{
NSLog(@"%@",@[weakSelf]);
}
};
}//第三種
第一種:是我經(jīng)常寫的方法,這里出問題了如果self釋放了,weakSelf指向nil,數(shù)組里面放nil也一樣會crash。
第二種:接一下的時候很可能weakSelf已經(jīng)置為nil,一樣會crash。
第三種:做一次判斷是否nil,完善了寫法。
block內(nèi)存管理擴展
- (void)blockRetainCycleProblemExt
{
//下面的self用不用weak?
[UIView animateWithDuration:1 animations:^{
self.view.frame = CGRectMake(1,2,3,4);
}];
//那這個呢?
[UIView animateWithDuration:1 delay:100000 optios:0 animations:^{
self.view.frame = CGRectMake(1,2,3,4);
} completion:nil];
}
//解答 :
類方法。這里面的block是瞬間執(zhí)行的。
理解應用架構
//對 MVC 和 MVVM 的理解真的到位么
深入理解內(nèi)存管理
1、Stack 和 Heap 分別的使用,如何管理?
2、ARC 是如何實現(xiàn)的?
3、Autorelease 對象如何釋放?
4、AutoreleasePool 是如何實現(xiàn)的?
理解 Class 和對象模型
理解 RunLoop
深入理解消息機制
//從寫下 [ obj foo]這行代碼直到運行時 foo 被調用,
//盡量詳細的描述,中間都發(fā)生了什么?
掌握:objc_msgSend 的關鍵調用,后續(xù)如何通過 selector 從 isa 找到 IMP,若運行時沒找到 foo 會如何?
精通:編譯器如何編譯成 objc_msgSend、 消息 cache 機制、消息轉發(fā)機制、 objc_msgSend 的各個版本、objc_msgSend 的實現(xiàn)、跳板機制等等
魔法數(shù)字
//64位,下面魔法數(shù)字會輸出什么,為什么?
- (void)magicNumberProblem
{
NSLog(@"%@",11529223390768879413UL);//Tagged Pointer
}
另辟蹊徑的 block 調用
//如果禁止直接調用:block();
//那能否找到2個以上另辟蹊徑的方式讓 block 被調用?
void (^block)(void) = ^{
NSLog(@"block get called");
};
block();//禁止調用
//解決:
讓別人幫你調用 傳入block
[UIView animateWithDuration:0 animation:block];//這里的bolck立馬調用
dispatch_async(dispatch_get_main_queue(), block);
[[NSBlockOperation blockOperationWithBlock:block] start];
談談iOS進階
漫長的知識點積累
- 看書
- 看博客
- 實戰(zhàn)總結
- 刨根問底
聯(lián)想、理解,有自己的思考、對技術的主見
總結
看完直播后感覺基礎好差。積累的還是不夠多,接下來就這針對這些問題好好的研究研究了。