作為一個iOS開發(fā)的菜鳥,今年初打算看看新機會,在上海陸續(xù)面試了幾家知名的互聯(lián)網(wǎng)公司,包括(今日頭條, 2345, wifi萬能鑰匙, 全民直播)等大公司。在這里將我遇到的面試題做個總結(jié),分享給大家。。。。。第一次寫文章,排版也不會。措辭方面請海涵。(表情怎么輸 。。)
今日頭條
第一家去的就是頭條,當時收到面試通知還是挺激動的,約的希望兩點面試,結(jié)果早到了半個多小時,在公司門口閑逛了20幾分鐘才進去,竟然沒有筆試。。
作為iOS面試,property 關(guān)鍵字 是逃不開的。
1,property 關(guān)鍵字修飾符有哪些??默認的修飾符是什么
nonatomic,atomic,strong, weak, copy,?assign,?readwrite,?readonly,? getter ,setter?
如果是基本數(shù)據(jù)類型
???@property (atomic, readwrite, assign) NSInteger count;
如果是對象類型
@property (atomic, readwrite, strong) UIView *view;
比較狗血的是,當時讓我手寫這些關(guān)鍵字,一直使用智能提示,有幾個關(guān)鍵字還拼錯了,
2, copy 和strong 的區(qū)別是什么,在什么情況下使用copy
首先,strong 是持有特性,setter方法將傳入的對象先保留在賦值,引用計數(shù)會+1,也就是對象的指針是指向的同一塊區(qū)域 .而copy 是賦值特性setter方法會將傳入的對象copy一份,將指針指向備份的那塊區(qū)域, 保證了數(shù)據(jù)的安全性,copy主要用于有可別子對象的對象中如(NSString, NSArray, NSDictionary, 它們都有對應(yīng)的可別子類)。當對象通過子類修改時,不會影響到之前保存的數(shù)據(jù)。
這里 面試官舉了個例子??,? 說分別使用copy 和strong 修飾一個屬性,怎么打印出不同的值,
{
@property (nonatomic, copy) NSString *objc; 或者
@property (nonatomic, strong) NSString *objc;
——————————? // 這里怎么寫
self.objc =? // 這里賦值
———————————— // 這里怎么寫
NSLog(@"%@", self.objc)? ?// 此處輸出結(jié)果不同
*** 當時沒有聽明白面試官的意思。沒答上來,悲劇了(哭瞎。。)
后來面完后,仔細琢磨了面試官的意思,猜想應(yīng)該還是問的copy 和strong 的運用。其實很簡單(哎,可惜為時已晚,這里提醒大家,一定要先聽懂面試官問的點在哪里,再思考)
NSMutableString*str = [NSMutableString stringWithFormat:@"hello"];
self.objc = str;
[str appendString:@"world"];
如果使用copy 會備份賦值之前的,所以只會輸出 "hello";
而如果使用strong的話,指針指向的是同一塊內(nèi)存區(qū)域,所以當子類修改了,self.objc 也會修改。
3,weak 和assign 的區(qū)別。
weak 只能修飾 對象類型的,而assign可以修飾基本數(shù)據(jù)類型 和對象類型。用weak 修飾的對象,當對象銷毀時,系統(tǒng)會將指向?qū)ο蟮闹羔樦脼閚il,? assign 不會自動置為nil, 容易造成野指針錯誤。
4, weak 的內(nèi)部實現(xiàn)你知道嗎,(問的應(yīng)該就是weak 是如何實現(xiàn) 變量的自動置為nil)
weak的實現(xiàn)是借助于runtime的, 首先runtime對注冊的類會進行布局, 對應(yīng)weak對象會放入一個hash表中,用weak指向的對象的內(nèi)存地址作為key,當這個對象引用計數(shù)為0的時候,對象會銷毀,假如這個對象的內(nèi)存地址是0Xa ,那么系統(tǒng)就會以0Xa為鍵,在這個weak 表中查詢,找到所有已0Xa為鍵的對象,設(shè)置為nil. (在oc中向nil發(fā)送消息時安全的)
5,有碰到過循環(huán)引用的問題嗎,你是怎么解決的。
當然有碰到過,(誰能沒有碰到過呢,哭笑)。
當兩個對象之間,直接或者間接都強持有對方的時候,循環(huán)引用就產(chǎn)生了,或者在使用block 和delegate 時,如果不小心也會產(chǎn)生循環(huán)引用的可能。
一般當兩個對象發(fā)生強引用時,可以通過一方使用weak 將一方的強引用弱化。在使用block時,可以借助?__weak typeof(self) weakSelf = self; 解除block 對self的強引用,但是在使用weakSelf 的時候,最好使用?__strongtypeof(weakSelf) strongSelf = weakSelf ,避免在block中self 銷毀。
6,我們都知道在使用NSTime的時候 ,Time 的Target 會對傳入的對象強引用。如果讓你實現(xiàn)一個分類,將taget 置為弱引用,并且當target 銷毀時 time 自動失效 應(yīng)該怎么實現(xiàn)。(這個真不會,工作中也沒遇到過呀。??扌Γ?/p>
后來查了下貌似可以使用NSProxy 來實現(xiàn);(NSProxy 是一個虛類,可以通過繼承它,重寫消息轉(zhuǎn)發(fā)的方法,將方法轉(zhuǎn)發(fā)給另一個實例。)
具體做法時:?

重寫消息轉(zhuǎn)發(fā)方法,將消息轉(zhuǎn)發(fā)到以weak 修飾的objc 上。

在使用NSTime的時候,Target 設(shè)置為myProxy 對象。

由于myProxy 對象并沒有實現(xiàn)timeEvent 方法。那么在運行時找不到方法實現(xiàn),就會進入消息轉(zhuǎn)發(fā)流程,在消息轉(zhuǎn)發(fā)流程里,通過將消息轉(zhuǎn)發(fā)給了weak? ?--> objc(也就是 self)從而實現(xiàn)了對Traget 對self的弱引用。
7,iOS11 都有哪些新的特性。
當時只記得導(dǎo)航欄有些改動,還有棄用了automaticallyAdjustsScrollViewInsets 新增加了contentInsetAdjustmentBehavior 來設(shè)置Scroll ContentInset? 以及tableView新增加了設(shè)置滑動的兩個代理方法。竟然忘記了,在iOS11 開始新增加了ARKit 和Core ML 兩個重要的功能。
后來面試官可能覺得我太菜了,就結(jié)束了面試。。
? (后期陸續(xù)會更新在其他大廠面試遇到的問題。)