前言:今日頭條的iOS高級開發(fā)崗第三面握侧,下面記錄這次面試的回憶以作日后復(fù)習(xí)呼畸。
一、自我介紹
簡單介紹一下你自己吧
- 解析:簡單介紹下自己的名字待讳,教育背景芒澜,現(xiàn)在的工作,做過的項目
二创淡、自我介紹衍生的口頭問題
講講下你在你項目中做過的優(yōu)化或者技術(shù)難點
- 解析:介紹了自己封裝的一個集picker痴晦,文本域的靈活展開的表視圖。這個視圖的數(shù)據(jù)源是json琳彩,怎么轉(zhuǎn)成模型數(shù)組的阅酪?這個cell有哪些類型?展示的怎么區(qū)分這些cell汁针?這里面有用過復(fù)用機制嗎术辐?這些cell有實現(xiàn)過多重繼承嗎?
- 題外話:這種問題最好各人自己找問題講講施无,不多辉词,提前準(zhǔn)備一個你項目中非常擅長并熟悉的點,即可猾骡。
三瑞躺、編程題:實現(xiàn)以下功能
- 編寫一個自定義類:Person,父類為NSObject
- 解析:頭文件這樣寫
@interface Person:NSObject
- 該類有兩個屬性兴想,外部只讀的屬性
name
幢哨,還有一個屬性age
- 解析:
name
的修飾符nonatomic
,strong
嫂便,readonly
捞镰。age
的修飾符nonatomic
,copy
。
- 為該類編寫一個初始化方法
initWithName:(NSString *)nameStr
岸售,并依據(jù)該方法參數(shù)初始化name
屬性践樱。
- 解析:頭文件聲明該方法,實現(xiàn)文件實現(xiàn)該方法
- 如果兩個Person類的name相等凸丸,則認(rèn)為兩個Person相等
- 解析:重寫
isEqual
拷邢,這里面涉及到了哈希函數(shù)在iOS中的應(yīng)用。
四屎慢、由編程題衍生的口頭題目
4.1
題目: 怎樣實現(xiàn)外部只讀的屬性瞭稼,讓它不被外部篡改
解析:
頭文件用readonly修飾并聲明該屬性。正常情況下腻惠,屬性默認(rèn)是readwrite环肘,可讀寫,如果我們設(shè)置了只讀屬性妖枚,就表明不能使用setter方法廷臼。在.m文件中不能使用
self.ivar = @"aa";
只能使用實例變量_ivar = @"aa";
苍在,而外界想要修改只讀屬性的值绝页,需要用到kvc賦值[object setValue:@"mm" forKey:@"ivar"];
。實現(xiàn)文件里面聲明私有屬性寂恬,并在頭文件在protocol里面規(guī)定該屬性就可以了续誉,外部通過protocol獲取,這樣還可以達(dá)到隱藏成員的效果初肉。
4.2
題目: nonatomic是非原子操作符酷鸦,為什么要這樣,atomic為什么不行牙咏?有人說能atomic耗內(nèi)存臼隔,你覺得呢?保讀寫安全嗎妄壶,能保證線程安全嗎摔握?有的人說atomic并不能保證線程安全,你覺得他們的出發(fā)點是什么丁寄,你認(rèn)同這個說法嗎氨淌?
- 關(guān)于為什么用nonatomic
如果該對象無需考慮多線程的情況,請加入這個屬性修飾伊磺,這樣會讓編譯器少生成一些互斥加鎖代碼盛正,可以提高效率。
而atomic這個屬性是為了保證程序在多線程情況下屑埋,編譯器會自動生成一些互斥加鎖代碼豪筝,避免該變量的讀寫不同步問題。
atomic 和 nonatomic 的區(qū)別在于,系統(tǒng)自動生成的 getter/setter 方法不一樣壤蚜。如果你自己寫 getter/setter即寡,那 atomic/nonatomic/retain/assign/copy 這些關(guān)鍵字只起提示作用,寫不寫都一樣袜刷。
- 關(guān)于atomic語nonatomic的實現(xiàn)