ios面試
Ⅰ iOS開發會面試哪些問題
1、淺復制和深復制的區別?2、obc中的協議和java中的介面概念有何不同? 3、解釋內一下KVO 和 KVC? 4、通知和協議的容不同之處? 每個公司的面試題不一樣,可以下載「猿人部落」問問裡面大牛,這樣全面一些。
Ⅱ 知乎上的一個怎麼面試iOS工程師的問題
1.什麼是arc?(arc是為了解決什麼問題誕生的?)
首先解釋ARC: automatic reference counting自動引用計數。
ARC幾個要點:
在對象被創建時 retain count +1,在對象被release時 retain count -1.當retain count 為0 時,銷毀對象。
程序中加入autoreleasepool的對象會由系統自動加上autorelease方法,如果該對象引用計數為0,則銷毀。
那麼ARC是為了解決什麼問題誕生的呢?這個得追溯到MRC手動內存管理時代說起。
MRC下內存管理的缺點:
1.當我們要釋放一個堆內存時,首先要確定指向這個堆空間的指針都被release了。(避免提前釋放)
2.釋放指針指向的堆空間,首先要確定哪些指針指向同一個堆,這些指針只能釋放一次。(MRC下即誰創建,誰釋放,避免重復釋放)
3.模塊化操作時,對象可能被多個模塊創建和使用,不能確定最後由誰去釋放。
4.多線程操作時,不確定哪個線程最後使用完畢
2.請解釋以下keywords的區別: assign vs weak, __block vs __weak
assign適用於基本數據類型,weak是適用於NSObject對象,並且是一個弱引用。
assign其實也可以用來修飾對象,那麼我們為什麼不用它呢?因為被assign修飾的對象在釋放之後,指針的地址還是存在的,也就是說指針並沒有被置為nil。如果在後續的內存分配中,剛好分到了這塊地址,程序就會崩潰掉。
而weak修飾的對象在釋放之後,指針地址會被置為nil。所以現在一般弱引用就是用weak。
首先__block是用來修飾一個變數,這個變數就可以在block中被修改(參考block實現原理)
__block:使用__block修飾的變數在block代碼快中會被retain(ARC下,MRC下不會retain)
__weak:使用__weak修飾的變數不會在block代碼塊中被retain
同時,在ARC下,要避免block出現循環引用 __weak typedof(self)weakSelf = self;
3.__block在arc和非arc下含義一樣嗎?
是不一樣的。
在MRC中__block variable在block中使用是不會retain的
但是ARC中__block則是會Retain的。
取而代之的是用__weak或是__unsafe_unretained來更精確的描述weak reference的目的
其中前者只能在iOS5之後可以使用,但是比較好 (該物件release之後,此pointer會自動設成nil)
而後者是ARC的環境下為了相容4.x的解決方案。
所以上面的範例中
__block MyClass* temp = …; // MRC環境下使用
__weak MyClass* temp = …; // ARC但只支援iOS5.0以上的版本
__unsafe_retained MyClass* temp = …; //ARC且可以相容4.x以後的版本
4.使用nonatomic一定是線程安全的嗎?()
不是的。
atomic原子操作,系統會為setter方法加鎖。 具體使用 @synchronized(self){//code }
nonatomic不會為setter方法加鎖。
atomic:線程安全,需要消耗大量系統資源來為屬性加鎖
nonatomic:非線程安全,適合內存較小的移動設備
5.描述一個你遇到過的retain cycle例子。
block中的循環引用:一個viewController
@property (nonatomic,strong)HttpRequestHandler * handler;
@property (nonatomic,strong)NSData *data;
_handler = [httpRequestHandler sharedManager];
[ downloadData:^(id responseData){
_data = responseData;
}];
1
2
3
4
5
6
self 擁有_handler, _handler 擁有block, block擁有self(因為使用了self的_data屬性,block會 一份self)
解決方法:
__weak typedof(self)weakSelf = self
[ downloadData:^(id responseData){
weakSelf.data = responseData;
}];
1
2
3
4
6.+(void)load; +(void)initialize;有什麼用處?
在Objective-C中,runtime會自動調用每個類的兩個方法。+load會在類初始載入時調用,+initialize會在第一次調用類的類方法或實例方法之前被調用。這兩個方法是可選的,且只有在實現了它們時才會被調用。
共同點:兩個方法都只會被調用一次。
7.為什麼其他語言里叫函數調用, objective c里則是給對象發消息(或者談下對runtime的理解)
先來看看怎麼理解發送消息的含義:
曾經覺得Objc特別方便上手,面對著 Cocoa 中大量 API,只知道簡單的查文檔和調用。還記得初學 Objective-C 時把[receiver message]當成簡單的方法調用,而無視了「發送消息」這句話的深刻含義。於是[receiver message]會被編譯器轉化為:
objc_msgSend(receiver, selector)
如果消息含有參數,則為:
objc_msgSend(receiver, selector, arg1, arg2, ...)
如果消息的接收者能夠找到對應的selector,那麼就相當於直接執行了接收者這個對象的特定方法;否則,消息要麼被轉發,或是臨時向接收者動態添加這個selector對應的實現內容,要麼就乾脆玩完崩潰掉。
現在可以看出[receiver message]真的不是一個簡簡單單的方法調用。因為這只是在編譯階段確定了要向接收者發送message這條消息,而receive將要如何響應這條消息,那就要看運行時發生的情況來決定了。
Objective-C 的 Runtime 鑄就了它動態語言的特性,這些深層次的知識雖然平時寫代碼用的少一些,但是卻是每個 Objc 程序員需要了解的。
Objc Runtime使得C具有了面向對象能力,在程序運行時創建,檢查,修改類、對象和它們的方法。可以使用runtime的一系列方法實現。
Ⅲ iOS:面試一般問哪些
目前形勢,參加到iOS隊伍的人是越來越多,甚至已經到供過於求了。今年,找過工作人可能會更深刻地體會到今年的就業形勢不容樂觀,加之,培訓機構一火車地向用人單位輸送iOS開發人員,打破了生態圈的動態平衡。矯情一下,言歸正傳,我奉獻一下,為iOS應聘者梳理一下面試題,希望能助一臂之力!
OC的理解與特性
OC作為一門面向對象的語言,自然具有面向對象的語言特性:封裝、繼承、多態。它既具有靜態語言的特性(如C++),又有動態語言的效率(動態綁定、動態載入等)。總體來講,OC確實是一門不錯的編程語言,
Objective-C具有相當多的動態特性,表現為三方面:動態類型(Dynamic typing)、動態綁定(Dynamic binding)和動態載入(Dynamic loading)。動態——必須到運行時(run time)才會做的一些事情。
動態類型:即運行時再決定對象的類型,這種動態特性在日常的應用中非常常見,簡單來說就是id類型。事實上,由於靜態類型的固定性和可預知性,從而使用的更加廣泛。靜態類型是強類型,而動態類型屬於弱類型,運行時決定接受者。
動態綁定:基於動態類型,在某個實例對象被確定後,其類型便被確定了,該對象對應的屬性和響應消息也被完全確定。
動態載入:根據需求載入所需要的資源,最基本就是不同機型的適配,例如,在Retina設備上載入@2x的圖片,而在老一些的普通蘋設備上載入原圖,讓程序在運行時添加代碼模塊以及其他資源,用戶可根據需要載入一些可執行代碼和資源,而不是在啟動時就載入所有組件,可執行代碼可以含有和程序運行時整合的新類。
Ⅳ 2018iOS面試題
1.進程和線程的區別
2.如何保證線程安全
3.了解哪些設計模式
4.MVC設計模式的思想是什麼
5.堆和棧專的區別,工程屬項目中的哪些數據是儲存在堆哪些在棧中
6.iOS中的NSCopying協議,,MutableCopy的區別
7.解釋屬性修飾關鍵詞的作用
8.tcp為什麼要進行三次握手?不是2次,4次
9.HTTP為什麼底層是TCP不是UDP
10.Blcok,NSNotification,delegate,Observer比較
Ⅳ ios面試項目難點有哪些
首先,談一下面試前的准備,分為兩個方面;
—:廣泛閱覽面試題目,找出重點題目,事先將答案記好。很多人以為自己做了幾個項目,平時也有認真學習,不屑於去臨時抱佛腳,這是大錯特錯的,很多你了解的東西到面試時會由於心理壓力,而讓你表訴不清楚,面試官聽的似懂非懂,結果不言而喻,廣泛閱讀也讓你在面試時顯得涉獵廣,游刃有餘。
二:重中之重,簡歷的書寫,一份好的簡歷讓你在別人開口前,印象分就多了20分。簡歷分三個方面:(1)個人信息(2)個人技能(3)項目經驗;最後再加上點個人評價(一兩句話即可,寫一句「適應力強,自學力強」通用。切忌寫一大堆。)
面試核心思想:引導面試官(過程中體會,結尾總結)。禮儀,著裝我就不說了,大家都是成年人。
一般來說,如果你是同幾個人一起面試,不要做第一個,原因很簡單,你看看「我是歌手」你就明白了。當面試了好幾個人後,第一個人的印象會降低,但凡a,b,c能力相差無幾,b,c成功率要高過a,另一個重要原因是,後者通常會被問到a沒答好的問題,你若是能答好,高下立判。至於答不好,面試官也覺得你們一個水平。
Question 1:什麼是面向對象。
切入: 面試官要的不是答案本身,而是你的邏輯表述,理解,及應用。
答:面向對象是區別於面向過程而言的,面向過程可以表述為:程序 = 演算法+ 數據結構 ;面向對象可以表述為 程序 = 對象 + 消息。
面向對象是盡可能模擬人類習慣的思維方式,使開發軟體的方法與過程盡可能接近人類認識世界解決問題的方法與過程。 我們強調「萬物皆對象」,我們抽象他們的屬性與行為出來,以代碼的形式展現。它有三個基本特徵
1.封裝:
封裝就是,隱藏內部具體實現,只提供介面方法去訪問。比如我們調用NSString類的,截取,拼接方法時,我們並不需要具體的演算法,而只需調用相應方法。
2. 繼承:
它是面向對象的程序中兩個類之間的一種關系,即一個類可以從另一個類(即它的父類)繼承狀態和行為。繼承父類的類稱為子類。
繼承的優越性:通過使用繼承,程序員可以在不同的子類中多次重新使用父類中的代碼,使程序結構清晰,易於維護和修改,而子類又可以提供一些特殊的行為,這些特殊的行為在父類中是沒有的 。
3.多態:
是指一個程序中同名的方法共存的情況,調用者只需使用同一個方法名,系統會根據不同情況,調用相應的不同方法,從而實現不同的功能。多態性又被稱為「一個名字,多個方法」。
以上的操作就是為了實現代碼復用,實現代碼的可移植性,靈活性,及低耦合,高內聚。
一個問題居然寫了這么多。。。。。。
Question 2:簡單介紹下你做的項目(這里就是開始引導面試官了,如果他不問這個問題,你就自己提出來,你要知道面試官其實也緊張,他不知道你會些什麼,它可能懂得多,卻也有無從下手的感覺,你遞個枕頭,他肯定會接的。)
答:(選取你自己會的答,比如)我用到了自定義cell顯示數據,使用三方框架AFNetworking,ASIHttpRequest,訪問網路,拿到Jason,XML格式數據,然後進行一些數據的解析,本地存儲,還有用xmpp實現的即時聊天,在本地用代理,通知,block進行類之間的通信,並植入了地圖,實現了上拉載入,下拉刷新功能。。。。。
看到沒有,面試問題就出來了
1.講一下tableViewCell的復用問題(重點)
這是指它的重用機制,先明白為什麼要重用,無他:效率,內存。
查看UITableView頭文件,會找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells兩個結構。visiableCells內保存當前顯示的cells,reusableTableCells保存可重用的cells。
TableView顯示之初,reusableTableCells為空,那麼tableView :CellIdentifier返回nil。開始的cell都是通過[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]來創建,而且cellForRowAtIndexPath只是調用最大顯示cell數的次數。
比如:有100條數據,iPhone一屏最多顯示10個cell。程序最開始顯示TableView的情況是:
1. 用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]創建10次cell,並給cell指定同樣的重用標識(當然,可以為不同顯示類型的cell指定不同的標識)。並且10個cell全部都加入到visiableCells數組,reusableTableCells為空。
2. 向下拖動tableView,當cell1完全移出屏幕,並且cell11(它也是alloc出來的,原因同上)完全顯示出來的時候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。
3. 接著向下拖動tableView,因為reusableTableCells中已經有值,所以,當需要顯示新的cell,cellForRowAtIndexPath再次被調用的時候,tableView :CellIdentifier,返回cell1。cell1加入到visiableCells,cell1移出reusableTableCells;cell2移出visiableCells,cell2加入到reusableTableCells。之後再需要顯示的Cell就可以正常重用了。
2.講一下如何根據內容自定義cell行高
以前用的三方RTLabel(非arc,int,NSInteger等問題,方法過老,版本無跟新,以棄用)
// iOS6中的方法,在iOS7中棄用了
/* CGSize textSize = [textArray sizeWithFont:[UIFont systemFontOfSize:16.0] constrainedToSize:CGSizeMake(280, 100000000) lineBreakMode:NSLineBreakByWordWrapping];*/
// 定義一個字典,裡面還可以放入其他屬性,不僅僅是字體大小
NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:15.0]};
//iOS7中提供的計算文本尺寸的方法 CGSize textSize1 = [textArray boundingRectWithSize:tableView.bounds.size options: | attributes:attribute context:nil].size;
NSLog(@"%f",textSize1.height);
3.講一下AFNetworking,ASIHttpRequest
3.jason和xml的區別(重點)
底層展現不同,比如jason用{}表示字典[]數組
4.本地數據如何存儲,用到些什麼方法(重點)
coredata,NSUserDefaultCenter,資料庫,寫入文件
5.xmpp的理解
6.代理,通知,和block的區別(重點)
代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復雜度。另外一點,代理可以理解為java中的回調監聽機制的一種類似。
代理通知區別,代理通常一對一,需要返回數據,通知一對多,不需要返回數據,block是ios4以後使用,方便,但是格式怪異。
7.講一下下拉刷新的實現
8.用到過什麼地圖
9.用過資料庫嗎,增刪改查關鍵字(重點)
10.自定義過什麼控鍵嗎
11.viewcontroller的生命周期(重點)
12.網路安全問題(重點)
從get post 出發,談到數據md5加密,協議安全,源代碼安全
13.資料庫安全問題
14.多線程問題
15.數據結構,堆棧問題
16.循環引用
17.線程,進程
17.最後一個arc非arc,自動釋放池(重點)
Ⅵ ios面試談談開發中遇到過哪些坑
這個問題 你還是問那些專業的iOS開發人員吧。。。那個國信安的老師,很不錯。。可以問問。。
Ⅶ ios面試需要注意什麼
1.儀態得當
正所謂,人靠衣裝。衣著是否整潔得體,發型是否利落,精神面貌是否神采奕奕,決定了面試官對求職的第一印象。為了讓面試官第一眼就對你充滿好感,你需要在穿著上注重細節,一套得體的服裝,干凈利落的氣質,能大大提高你面試成功的幾率。
2.保持自信
談談自己,一般是iOS面試的「前菜」,對於求職者來說,這是一個證明自己有多優秀的機會。如果你准備了一大堆溢美之詞來包裝自己,不妨根據企業的用人標准,挑選最能代表自己能力、最能說明自己經驗和優點的具體事跡來說。在回答問題過程中,保持謙虛但不可過分謙卑,尤其是對於技術問題更要備足信心。沒有公司願意僱傭對自己技術都信心不足的員工。
3.切忌說話不經大腦,背誦解決方案
在面試過程中,你需要展現你的應變能力,但並非是不經大腦地脫口而出。做iOS需要嚴謹的思維,在回答問題之前最好理一下自己的思路,快但卻沒條理的回答只會暴露你缺乏思考能力、粗心的缺點。如果你事先做的功課正好是面試官提出的問題,切忌一味背誦答案,結合你自己的實際經驗來侃侃而談,一定會贏得面試官的好感。
4.不要寫上你不清楚的技術
面試之前,你需要好好回顧一下自己做過的項目,展現自己在團隊中的重要作用,都會為你實現高薪大大加分。盡可能更全面地展現出你在iOS編程上的技能,讓面試官對你的能力有更全面的了解,但切勿在簡歷中寫上自己並不清楚的技術。在技術更新極快的當下,編程過程中總會遇到一些自己不清楚的問題,而面試官更看重的是你的態度。寫上你並不熟悉的技術,問題稍微深入一些你就容易露餡。假如你是誠信而勇於挑戰的話,面試官一定會對你青睞有加。
Ⅷ 如何面試 ios 工程師
面試經抄歷:
人事郵件本來約的11點打電話過來面試,然,結果到11.25才打過來。合肥的一個人打過來的。讓我自我介紹,然後問的都是一些簡單的基礎知識,可能太在意了回答的不夠流暢的。但是改說的東西我多說了。可能就是項目架構設計沒講好,最後被Pass了。
面試官提的問題:
1. 什麼是arc?(arc是為了解決什麼問題誕生的?)2. 請解釋以下keywords的區別: assign vs weak, __block vs __weak3. __block在arc和非arc下含義一樣嗎?4. 使用atomic一定是線程安全的嗎?5. 描述一個你遇到過的retain cycle例子。(別撒謊,你肯定遇到過)6. +(void)load; +(void)initialize;有什麼用處?7. 為什麼其他語言里叫函數調用, objective c里則是給對象發消息(或者談下對runtime的理解)8. 什麼是method swizzling?9. UIView和CALayer是啥關系?10. 如何高性能的給UIImageView加個圓角?(不準說layer.cornerRadius!)
Ⅸ 如何面試 iOS 工程師
程序員面試iOS開發工程師都會遇到哪些問題?下面是一些問題分享,希望對以後的面試會有所幫助。
首先需要聲明的是,此次的面試者大多在有1~3年的iOS開發經驗,並非需要找一個真正的大牛,所以准備的題目,自己覺得大多數還是比較基礎,比較能夠看出這個層次的人的水準的。如果也是個有3年左右開發經驗的從業者,不妨一試。
面試開始的時候,會讓面試者選擇一個他最熟悉的項目,給介紹一下它的技術架構,以及面試者在其中參與的模塊和具體工作。事實上,很多開發者並不明白提到的「架構」的具體意思,有些人說了一大堆產品的功能,還有人說的非常籠統(比如,遵循MVC架構之類),一般這種時候會打斷他們,直接讓他們給講一下這個APP的層次結構,或者是核心模塊等。
之後會問兩個問題:
1. 講述一次在這個APP中,用戶觸發了一個事件,引起了一個服務請求,然後獲取服務端返回,並且更新前端界面的過程。請說的詳細一點,比如數據經過了哪些類的處理,每一次傳遞時的格式是怎麼樣的?
2. 參與的APP,是如何處理多個服務的同步發起的?隨後讓面試者說一下APP的界面架構,這個比較隨意。
問完了項目,就開始基礎知識題啦~
Model層:
數據持久化存儲方案有哪些?
沙盒的目錄結構是怎樣的?各自一般用於什麼場合?
SQL語句問題:inner join、left join、right join的區別是什麼?
sqlite的優化
網路通信用過哪些方式(100%的人說了AFNetworking...)
如何處理多個網路請求並發的情況
在網路請求中如何提高性能
在網路請求中如何保證安全性
語言與基礎知識:
內存中的棧和堆的區別是什麼?那些數據在棧上,哪些在堆上?
#define和const定義的變數,有什麼區別
什麼情況下會出現內存的循環引用
block中的weak self,是任何時候都需要加的么?
GCD的queue,main queue中執行的代碼,一定是在main thread么?
NSOperationQueue有哪些使用方式
NSThread中的Runloop的作用,如何使用?
.h文件中的變數,外部可以直接訪問么?(注意是變數,不是property)
講述一下runtime的概念,message send如果尋找不到相應的對象,會如何進行後續處理 ?
TCP和UDP的區別是什麼?
MD5和Base64的區別是什麼,各自場景是什麼?
二叉搜索樹的概念,時間復雜度多少?
架構:(招的不是架構師,這方面問的不多,而且從之前對APP的架構介紹里可以邊聽邊問)
哪些類不適合使用單例模式?即使他們在周期中只會出現一次。
Notification的使用場景是什麼?同步還是非同步?
簡單介紹一下KVC和KVO,他們都可以應用在哪些場景?
APP相關:
如何添加一個自定義字體到工程中
如何製作一個靜態庫/動態庫,他們的區別是什麼?
Configuration中,debug和release的區別是什麼?
簡單介紹下發送系統消息的機制(APNS)
UI:
系統如何尋找到需要響應用戶操作的那個Responder
多屏幕尺寸的適配
UIButton的父類是什麼?UILabel呢?
push view controller 和 present view controller的區別
描述下tableview cell的重用機制
UIView的frame和bounds的區別是什麼
最後是幾道場景題,也是最喜歡問的:
發送10個網路請求,然後再接收到所有回應之後執行後續操作,如何實現?
實現一個第三方控制項,可以在任何時候出現在APP界面最上層
實現一個最簡單的點擊拖拽功能。
上面那個拖拽之外,如果在手放開時,需要根據速度往前滑動呢?
如何減小一個應用程序的尺寸?
如何提高一個性用程序的性能?
不同版本的APP,資料庫結構變化了,如何處理?
平心而論,這些題目並沒有特別難,沒有講到黑科技,也沒有講到ACM演算法題,都是iOS的基礎概念以及很容易遇到的場景。可能也是因為招的目標,也只是一個可以完成業務開發的3年左右經驗的人而已,所以大部分面試者水平並不如意,能答出以上大半題目,同時思路清晰態度積極向上的人,不到四分之一吧...
另外的感想就是,這個行業可能真的有點浮躁,很多面試者,連簡單的幾個場景題都答不出來,基礎知識更是一般,只會用幾個第三方庫,就開口要25~30w的年薪,還有一種愛理不理的感覺。也有些人,在原來的公司,自稱是技術負責人,但連APP的基本架構,包括哪些主要模塊都講不清楚,各種兜圈子,甚至有人講了半天的產品功能和亮點,不得不一次次打斷才能繼續面試。
學iOS,做的事情越多,越覺得自己有越多的東西要學,離大牛的標准也是越來越遠。而無論從深度還是廣度來看,iOS開發都是一個值得挖掘的技術領域。由於蘋果產品的火熱,市場上的iOS開發一直供不應求,但真正有能力,高素質的可能真的不那麼多。