面試問題一般按照三種思路去問纱皆,第一種是網(wǎng)絡(luò)上流傳的常見面試問題,第二種是根據(jù)應(yīng)聘者的簡歷悴品,挑選主題深入下去坦报,第三種是面試者自己感興趣的問題或者說是經(jīng)驗總結(jié)
第一部分:來自網(wǎng)絡(luò)上的
iOS數(shù)據(jù)持久化存儲方案有哪些?
- plist屬性列表存儲(如NSUserDefaults)
- 文件存儲(如二進制數(shù)據(jù)寫入文件存儲,通過NSFileManager來操作將下載起來的二進制數(shù)據(jù)寫入文件中存儲)
- NSKeydeArchiver歸檔存儲休玩,
- 數(shù)據(jù)庫SQLite3存儲(如FMDB著淆、Core Data)
- KeyChain,用戶名密碼
沙盒的目錄結(jié)構(gòu)是怎樣的拴疤?各自一般用于什么場合永部?
- Application:存放程序源文件,上架前經(jīng)過數(shù)字簽名呐矾,上架后不可修改
- Documents: 保存應(yīng)?運行時生成的需要持久化的數(shù)據(jù),iTunes同步設(shè)備時會備份該目 錄苔埋。例如,游戲應(yīng)用可將游戲存檔保存在該目錄
- tmp: 保存應(yīng)?運行時所需的臨時數(shù)據(jù),使?完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用 沒有運行時,系統(tǒng)也可能會清除該目錄下的文件蜒犯。iTunes同步設(shè)備時 不會備份該目錄
- Library/Caches: 保存應(yīng)用運行時?成的需要持久化的數(shù)據(jù),iTunes同步設(shè)備時不會備份 該目錄组橄。?一般存儲體積大荞膘、不需要備份的非重要數(shù)據(jù),比如網(wǎng)絡(luò)數(shù)據(jù)緩存存儲到Caches下
- Library/Preference: 保存應(yīng)用的所有偏好設(shè)置玉工,如iOS的Settings(設(shè)置) 應(yīng)?會在該目錄中查找應(yīng)?的設(shè)置信息羽资。iTunes同步設(shè)備時會備份該目錄
常見的出現(xiàn)內(nèi)存循環(huán)引用的場景有哪些?
- 定時器(NSTimer):NSTimer經(jīng)常會被作為某個類的成員變量遵班,而NSTimer初始化時要指定self為target屠升,容易造成循環(huán)引用(self->timer->self)。 另外狭郑,若timer一直處于validate的狀態(tài)腹暖,則其引用計數(shù)將始終大于0,因此在不再使用定時器以后翰萨,應(yīng)該先調(diào)用invalidate方法
- block的使用:block在copy時都會對block內(nèi)部用到的對象進行強引用(ARC)或者retainCount增1(非ARC)脏答。在ARC與非ARC環(huán)境下對block使用不當都會引起循環(huán)引用問題, 一般表現(xiàn)為亩鬼,某個類將block作為自己的屬性變量殖告,然后該類在block的方法體里面又使用了該類本身,簡單說就是self.someBlock = Type var{[self dosomething];或者self.otherVar = XXX;或者_otherVar = …};出現(xiàn)循環(huán)的原因是:self->block->self或者self->block->_ivar(成員變量)
- 代理(delegate):在委托問題上出現(xiàn)循環(huán)引用問題已經(jīng)是老生常談了辛孵,規(guī)避該問題的殺手锏也是簡單到哭丛肮,一字訣:聲明delegate時請用assign(MRC)或者weak(ARC),千萬別手賤玩一下retain或者strong魄缚,畢竟這基本逃不掉循環(huán)引用了宝与!
Block中weakSelf和strongSelf作用是什么?
__weak __typeof(self)weakSelf = self;
[self.context performBlock:^{
__strong __typeof(weakSelf)strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf doMoreThing];
} ];
用weakSelf是為了不讓Block增加引用計數(shù)冶匹,使self可以順利釋放
用strongSelf是為了防止事情還沒做完习劫,weakSelf就變成了nil
使用Block時何時需要WeakSelf和StrongSelf?
MD5和Base64的區(qū)別是什么,各自使用場景是什么嚼隘?
- MD5:是一種不可逆的摘要算法诽里,用于生成摘要,無法逆著破解得到原文飞蛹。常用的是生成32位摘要谤狡,用于驗證數(shù)據(jù)的有效性。比如卧檐,在網(wǎng)絡(luò)請求接口中墓懂,通過將所有的參數(shù)生成摘要,客戶端和服務(wù)端采用同樣的規(guī)則生成摘要霉囚,這樣可以防篡改捕仔。又如,下載文件時,通過生成文件的摘要榜跌,用于驗證文件是否損壞闪唆。
- Base64:屬于加密算法,是可逆的钓葫,經(jīng)過encode后悄蕾,可以decode得到原文。在開發(fā)中瓤逼,有的公司上傳圖片采用的是將圖片轉(zhuǎn)換成base64字符串笼吟,再上傳。在做加密相關(guān)的功能時霸旗,通常會將數(shù)據(jù)進行base64加密/解密。
發(fā)送10個網(wǎng)絡(luò)請求戚揭,然后再接收到所有回應(yīng)之后執(zhí)行后續(xù)操作诱告,如何實現(xiàn)?
從題目分析可知民晒,10個請求要全部完成后精居,才執(zhí)行某一功能。比如潜必,下載10圖片后合成一張大圖靴姿,就需要異步全部下載完成后,才能合并成大圖磁滚。
做法:通過dispatch_group_t來實現(xiàn)佛吓,將每個請求放入到Group中,將合并成大圖的操作放在dispatch_group_notify中實現(xiàn)垂攘。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*加載圖片1 */ });
dispatch_group_async(group, queue, ^{ /*加載圖片2 */ });
dispatch_group_async(group, queue, ^{ /*加載圖片3 */ });
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 合并圖片
});
iOS與H5交互的方式有哪些维雇?
- 通過協(xié)議在shouldStartRequest中捕獲請求,獲取scheme來判斷預(yù)先定義的功能晒他,然后調(diào)用native代碼吱型。比如,定義點擊圖片調(diào)用native來展示大圖陨仅,那么js接收到點擊時津滞,重定向?qū)D片的url添加上自定義scheme
- 通過iOS7以后引入的JavaScriptCore框架來實現(xiàn),通過注入對象的方式來實現(xiàn)灼伤,維護起來更簡單触徐。
- iOS引入的Webkit框架,使用WKWebView饺蔑,而不是UIWebView
- 通過WebViewJavascriptBridge這個第三方庫來實現(xiàn)
http的post和get的區(qū)別锌介?
- GET請求的數(shù)據(jù)會附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭中),以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連孔祸,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD隆敢。如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送崔慧,如果是空格拂蝎,轉(zhuǎn)換為+,如果是中文/其他字符惶室,則直接把字符串用BASE64加密温自,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進制表示的ASCII皇钞。
- POST把提交的數(shù)據(jù)則放置在是HTTP包的包體中悼泌。
GCD里面有哪幾種Queue?
- 主隊列 dispatch_main_queue(); 串行 夹界,更新UI
- 全局隊列 dispatch_global_queue(); 并行馆里,四個優(yōu)先級:background,low可柿,default鸠踪,high
- 自定義隊列 dispatch_queue_t queue ; 可以自定義是并行:DISPATCH_QUEUE_CONCURRENT或者串行DISPATCH_QUEUE_SERIAL
UIView和CALayer的關(guān)系?
- UIView是iOS系統(tǒng)中界面元素的基礎(chǔ)复斥,所有的界面元素都繼承自它营密。它本身完全是由CoreAnimation來實現(xiàn)的。它真正的繪圖部分目锭,是由一個叫CALayer(Core Animation Layer)的類來管理评汰。 UIView本身,更像是一個CALayer的管理器侣集,訪問它的跟繪圖和跟坐標有關(guān)的屬性键俱,例如frame,bounds等 等世分,實際上內(nèi)部都是在訪問它所包含的CALayer的相關(guān)屬性编振。
- UIView有個layer屬性,可以返回它的主CALayer實例臭埋,UIView有一個layerClass方法踪央,返回主layer所使用的 類,UIView的子類瓢阴,可以通過重載這個方法畅蹂,來讓UIView使用不同的CALayer來顯示,例如通過
- (class) layerClass {
return ([CAEAGLLayer class]);
}
使某個UIView的子類使用GL來進行繪制荣恐。
- UIView的CALayer類似UIView的子View樹形結(jié)構(gòu)液斜,也可以向它的layer上添加子layer累贤,來完成某些特殊的表 示。例如下面的代碼
grayCover = [[CALayer alloc] init];
grayCover.backgroundColor = [[[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
[self.layer addSubLayer: grayCover];
會在目標View上敷上一層黑色的透明薄膜少漆。
@synthesize和@dynamic分別有什么作用臼膏?
- @synthesize的語義是如果你沒有手動實現(xiàn)setter方法和getter方法,那么編譯器會自動為你加上這兩個方法示损。
- @dynamic告訴編譯器:屬性的setter與getter方法由用戶自己實現(xiàn)渗磅,不自動生成。假如一個屬性被聲明為@dynamic var检访,然后你沒有提供@setter方法和@getter 方法始鱼,編譯的時候沒問題,但是當程序運行到 instance.var = someVar脆贵,由于缺setter方法會導(dǎo)致程序崩潰医清;或者當運行到someVar = var 時,由于缺getter方法同樣會導(dǎo)致崩潰丹禀。編譯時沒問題状勤,運行時才執(zhí)行相應(yīng)的方法,這就是所謂的動態(tài)綁定双泪。
下面的代碼輸出什么?
@implementation Son : Father
- (id)init {
self = [super init];
if (self) {
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
// 輸出
NSStringFromClass([self class]) = Son
NSStringFromClass([super class]) = Son
這個題目主要是考察關(guān)于Objective-C中對self和super的理解密似。我們都知道:self是類的隱藏參數(shù)焙矛,指向當前調(diào)用方法的這個類的實例。那super呢残腌?
很多人會想當然的認為“super和self類似村斟,應(yīng)該是指向父類的指針吧!”抛猫。這是很普遍的一個誤區(qū)蟆盹。其實 super是一個 Magic Keyword,它本質(zhì)是一個編譯器標示符闺金,和self 是指向的同一個消息接受者逾滥!他們兩個的不同點在于:super會告訴編譯器,調(diào)用class 這個方法時败匹,要去父類的方法寨昙,而不是本類里的。
上面的例子不管調(diào)用[self class]還是[super class]掀亩,接受消息的對象都是當前 Son *xxx 這個對象舔哪。
當使用self調(diào)用方法時,會從當前類的方法列表中開始找槽棍,如果沒有捉蚤,就從父類中再找抬驴;而當使用super時,則從父類的方法列表中開始找缆巧。然后調(diào)用父類的這個方法布持。
在滑動頁面上的列表時,timer會暫定回調(diào)盅蝗,為什么鳖链?如何解決?
如果我們把一個NSTimer
對象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
添加到主運行循環(huán)中的時候, ScrollView滾動過程中會因為mode切換為UITrackingRunLoopMode
墩莫,而導(dǎo)致NSTimer將不再被調(diào)度芙委。
將NSTimer 的mode 設(shè)置為NSRunLoopCommonModes(kCFRunLoopCommonModes)
可以解決這個問題。
// 將timer添加到NSDefaultRunLoopMode中
// 默認會自動添加到Run Loop中狂秦,但是mode為NSDefaultRunLoopMode
[NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(timerTick:)
userInfo:nil
repeats:YES];
// 先添加定時器
// 默認會自動添加到Run Loop中灌侣,但是mode為NSDefaultRunLoopMode
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0
target:self
selector:@selector(timerTick:)
userInfo:nil
repeats:YES];
// 手動修改其mode為forMode:NSRunLoopCommonModes
// 在滾動時,定時器也可以正沉盐剩回調(diào)了
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
是否能通過 Category 給已有的類添加成員變量侧啼?
靜態(tài)添加時不可以的,不能通過編譯堪簿,但是可以動態(tài)添加痊乾。
func objc_getAssociatedObject(object: AnyObject!, key: UnsafePointer<Void> ) -> AnyObject!func objc_setAssociatedObject(object: AnyObject!, key: UnsafePointer<Void>, value: AnyObject!, policy: objc_AssociationPolicy)
iOS中級面試題一
iOS中級面試題二
知乎上的一個怎么面試iOS工程師的問題
第二部分:根據(jù)應(yīng)聘者的簡歷
自我介紹,職業(yè)發(fā)展規(guī)劃
- 學(xué)校椭更,工作年限哪审,公司背景,iOS相關(guān)的工作年限(2010年以前的都是先驅(qū)型的)
- 判斷技術(shù)偏好型虑瀑,還是技術(shù)加管理
- 看語言表達能力湿滓,溝通能力
- 是否積極向上,正能量
想離開的原因舌狗,選擇新公司的理由
- 是否穩(wěn)定
- 是否客觀
- 動機是否正能量
印象深刻的項目經(jīng)歷
- 項目規(guī)模叽奥,產(chǎn)品特色
- 技術(shù)選型,團隊合作
- 負責那一塊痛侍,技術(shù)難點朝氓,如何克服
看什么書,看誰的博客恋日,技術(shù)網(wǎng)站膀篮,gitHub上有沒有源碼,寫自己的博客嗎岂膳?
- 簡書
- 唐巧誓竿,王巍等
- Stack overflow, CocoaChina,V2EX
第三部分:本人關(guān)心的一些問題
基本上喜歡問一些開發(fā)式的問題谈截,技術(shù)選擇以及理由筷屡,發(fā)展方向的判斷涧偷,使用的感受、經(jīng)驗等等毙死。無所謂對錯燎潮,僅僅是探討,交流
界面開發(fā)技術(shù)的選擇扼倘?
- Storyboard
- xib
- 代碼
- AutoLayout / SizeClass SnapKit/Masonry
Swift和Object-C有什么不同确封?
- Swift是靜態(tài)語言,Object-C是動態(tài)語言
- Swift分面向?qū)ο蠛徒Y(jié)構(gòu)化兩部分再菊,Object-C面向?qū)ο?/li>
- 可選類型
- Public爪喘、internal、private關(guān)鍵字
數(shù)據(jù)庫的選擇纠拔?
- FMDB ccgus/fmdb
- CoreData magicalpanda/MagicalRecord
- 直接SqlLite C API
如何做Cache秉剑?
- NSURLCache
- 數(shù)據(jù)庫
- 序列化
界面性能優(yōu)化
- CPU,GPU稠诲,60幀每秒
- 異步UIView繪制和渲染
- ibireme/YYAsyncLayer
- facebook/AsyncDisplayKit
一些常用的第三方庫
Object-C
- AFNetworking/AFNetworking
- rs/SDWebImage
- SnapKit/Masonry
- ReactiveCocoa/ReactiveCocoa
- bang590/JSPatch
- react-native
Swift
Runtime的原理侦鹏,常見使用場景
- 發(fā)送消息,@Select是字符串臀叙,對應(yīng)函數(shù)指針略水,實現(xiàn)動態(tài)特性
- 本質(zhì)都是C的struct和函數(shù)指針
- 自動字典轉(zhuǎn)模型,利用屬性列表字段
- 實現(xiàn)NSCoding協(xié)議劝萤,利用屬性列表字段
- 方法替換聚请,利用SEL和IMP之間的對應(yīng)關(guān)系steipete/Aspects