1. 你使用過Objective-C的運行時編程(Runtime Programming)麼?若是使用過,你用它作了什麼?你還能記得你所使用的相關的頭文件或者某些方法的名稱嗎?
Objecitve-C的重要特性是Runtime(運行時),在#import <objc/runtime.h> 下能看到相關的方法,用過objc_getClass()和class_copyMethodList()獲取過私有API;使用
Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);
代碼交換兩個方法,在寫unit test時使用到。
2. 你實現過多線程的Core Data麼?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些須要在線程中建立或者傳遞?你是用什麼樣的策略來實現的?
沒實現過多線程的CoreData(待實踐)
<!--more-->
3. Core開頭的系列的內容。是否使用過CoreAnimation和CoreGraphics。UI框架和CA,CG框架的聯繫是什麼?分別用CA和CG作過些什麼動畫或者圖像上的內容。(有須要的話還能夠涉及Quartz的一些內容)
UI框架的底層有CoreAnimation,CoreAnimation的底層有CoreGraphics。
UIKit |
------------ |
Core Animation |
Core Graphics |
Graphics Hardware|
使用CA作過menu菜單的展開收起(太遜了)
4. 是否使用過CoreText或者CoreImage等?若是使用過,請談談你使用CoreText或者CoreImage的體驗。
CoreText能夠解決複雜文字內容排版問題。CoreImage能夠處理圖片,爲其添加各類效果。體驗是很強大,挺複雜的。
5.NSNotification和KVO的區別和用法是什麼?何時應該使用通知,何時應該使用KVO,它們的實現上有什麼區別嗎?若是用protocol和delegate(或者delegate的Array)來實現相似的功能可能嗎?若是可能,會有什麼潛在的問題?若是不能,爲何?(雖然protocol和delegate這種東西面試已經面爛了…)
NSNotification是通知模式在iOS的實現,KVO的全稱是鍵值觀察(Key-value observing),其是基於KVC(key-value coding)的,KVC是一個經過屬性名訪問屬性變量的機制。例如將Module層的變化,通知到多個Controller對象時,可使用NSNotification;若是是隻須要觀察某個對象的某個屬性,可使用KVO。
對於委託模式,在設計模式中是對象適配器模式,其是delegate是指向某個對象的,這是一對一的關係,而在通知模式中,每每是一對多的關係。委託模式,從技術上能夠如今改變delegate指向的對象,但不建議這樣作,會讓人迷惑,若是一個delegate對象不斷改變,指向不一樣的對象。
6. 你用過NSOperationQueue麼?若是用過或者瞭解的話,你爲何要使用NSOperationQueue,實現了什麼?請描述它和GCD的區別和相似的地方(提示:能夠從二者的實現機制和適用範圍來描述)。
使用NSOperationQueue用來管理子類化的NSOperation對象,控制其線程併發數目。GCD和NSOperation均可以實現對線程的管理,區別是 NSOperation和NSOperationQueue是多線程的面向對象抽象。項目中使用NSOperation的優勢是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具備面向對象的優勢(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。
項目中使用GCD的優勢是GCD自己很是簡單、易用,對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。
更詳細的答案見個人這篇文章
7. 既然提到GCD,那麼問一下在使用GCD以及block時要注意些什麼?它們兩是一回事兒麼?block在ARC中和傳統的MRC中的行爲和用法有沒有什麼區別,須要注意些什麼?如何避免循環引用?
使用block是要注意,若將block作函數參數時,須要把它放到最後,GCD是Grand Central Dispatch,是一個對線程開源類庫,而Block是閉包,是可以讀取其餘函數內部變量的函數。更詳細的答案見個人這篇文章
8. 您是否作過異步的網絡處理和通信方面的工做?若是有,能具體介紹一些實現策略麼?
9. 對於Objective-C,你認爲它最大的優勢和最大的不足是什麼?對於不足之處,如今有沒有可用的方法繞過這些不足來實現需求。若是能夠的話,你有沒有考慮或者實踐太重新實現OC的一些功能,若是有,具體會如何作?
最大的優勢是它的運行時特性,不足是沒有命名空間,對於命名衝突,可使用長命名法或特殊前綴解決,若是是引入的第三方庫之間的命名衝突,可使用link命令及flag解決衝突。
1.單例類NSNotificationCenter提供信息廣播通知,它採用的是觀察者模式的的通知機制(正確)
理解:NSNotificationCenter使用了KVO,即Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改後,則對象就會接收到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改後,KVO就會自動通知相應的觀察者了。
2.判斷:從通信錄數據庫查詢聯繫人數據,可經過ABAddressBookCopyArrayOfAllPeople和ABAddressBookCopyPeopleWithName函數來得到。
理解:從通信錄數據庫查詢聯繫人數據是沒法使用SQL語句,只能經過ABAddressBookCopyArrayOfAllPeople、ABAddressBookCopyPeopleWithName來得到。ABAddressBookCopyArrayOfAllPeople函數是經過人名查詢通信錄中的聯繫人,其中的name參數是查詢的前綴關鍵字。
3.NSURLConnection類的同步請求方法是?(A)
A.+sendSynchronousRequest:returningResponse:error:
B.-initWithRequest:delegate:
C.-initWithRequest:delegate:startImmediately:
理解:B和C都是異步方法,須要設置delegate屬性。
4.genstrings命名的基於語法:genstrings[-a] [-q] [-o]sourcefile (正確)
理解:下面是genstrings命名的基本語法:
genstrings [-a] [-q] [-o <outputDir>] sourcefile
其中參數:
-a:在存在的文件後面追加內容;
-q:關閉多個鍵值對的警告;
-o:指定輸出目錄
所以若是咱們想輸出到en.lproj目錄,則代碼以下:
genstrings -o en.lproj *.m
5.樹形結構導航模式是在內容上有層次的,從上到下或者分類包含等關係。例如黑龍江包含哈爾濱的關係,哈爾濱又包含了道里區等。(正確)
理解:樹形導航就是指的是從屬關係。
6.NSXML框架中核心的是NSXMLParser和它的委託協議NSXMLParserDelegate,NSXMLParserDelegate經常使用的方法有哪些?(ABCDE)
A. parserDidStartDocument
B. parser:foundCharacters
C. parser:didStartElement:namespaceURI:qualifiedName:attributes
D. parser:didEndElement:namespaceURI:qulificedName
E. parserDidEndDocument
7.NSXMLParser構造方法有哪些?(ABC)
A. initWithContentsOfURL
B. initWithData
C. initWithStream
D. initWithContentsOfFile
8.判斷是否爲iPad設備語句是?(C)
A. if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){....}
B. if([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone){....}
C. if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){....}
9.NSAssert相似的宏有哪些?(ABCD)
A. NSAssert1
B. NSAssert2
C.NSAssert3
D.NSAssert4
理解:查閱官方文檔:NSAssert1,NSAssert2,NSAssert3,NSAssert4,NSAssert5
10.Objective-C有哪幾種內存管理方法?(ABCD)、
A. MRR(Manual Retain Release)
B. MRC(Manual Reference Counting )
C.ARC(Automatic Reference Counting)
D.GC(Garbage Collection)
理解:MRR是MRC的官方名字;
MRC是手動引用計數;
ARC是自動引用計數;
GC是垃圾回收(在開發OS X中使用);
11. AddressBook框架中經常使用類?(ABCD)
A. ABAddressBook;
B. ABPerson;
C. ABGroup;
D. ABRecord;
12. AddressBookUI框架中的視圖控制器?(ABCD)
A. ABPeoplePickerNavigationController;
B. ABPersonViewController;
C. ABNewPersonViewController;
D.ABUnknownPersonViewController;
13.建立聯繫人使用的函數有哪些?(ABCD)
A. ABPersonCreate
B. ABRecordSetValue
C. ABMultiValueCreateMutable
D. ABAddressBookSave
14.修改聯繫人使用的函數有哪些?(CD)
A. ABPersonCreate
B. ABRecordSetValue
C. ABAddressBookGetPersonWithRecordID
D. ABAddressBookAddRecord
15.AddressBook高級API是在AddressBookUI框架中定義的,它爲咱們訪問通信錄數據提供了UI界面。該框架提供了哪些試圖控制器和委託協議?
A. ABPeoplePickerNavigationController
B. ABPersonViewController
C. ABUnknownPersonViewController
D. ABNewPersonViewController
16.iOS中持久化方式有哪些?(ABCD)
A. 屬性列表文件
B. 對象歸檔
C. SQLite數據庫
D. CoreData
17.NSURL的構造函數有?(CD)
A. + requestWithURL:
B - initWithURL:
C + URLWithString:
D - initWithString:
18.表視圖的相關類有哪些?(AB)
A. UITableView
B. UITableViewController
C. UITableViewDelegate
D.UITableViewDataSource
理解:注意CD是委託和數據源。
19.下面屬於表視圖內置的擴展視圖常量以下?(ABCD)
A. UITableViewCellAccessoryNone
B. UITableViewCellAccessoryDiscloureIndicator
C. UITableViewCellAccessoryDetailDisclosureButton
D.UITableViewCellAccessoryCheckmark
20.下面與導航相關的試圖控制器有那哪些?(BC)
A. UIViewController
B. UINavigationController
C. UITableBarController
D. UITableViewController
21.delegate中的property使用如下哪一個屬性?(A)
A. assign
B. retain
C. copy
D. strong
理解:assign防止循環引用;
22.關於Objective-C中屬性的說明,錯誤的是(D)
A. readwrite是可讀可寫特性,須要生成getter方法和setter方法;
B. readonly是隻讀特性,只有getter方法,沒有setter方法;
C.assign是賦值屬性,setter方法將傳入參數賦值給實例變量;
D.retain表示持有特性,copy屬性表示拷貝屬性,都會創建一個相同的對象;
理解:
copy是建立一個新對象。
retain是建立一個指針,引用對象計數+1.
copy屬性表示兩個對象內容相同,新的對象retain爲1,與舊有對象的引用計數無關。舊有對象沒有變化。copy減小對象對上下文的依賴。
retain屬性表示兩個對象地址相同(創建一個指針,指針拷貝),內容就是同一個內容,這個對象的retain+1。
也就是說,copy是內容拷貝,retain是內容拷貝。
23.下面對category類別描述不正確的是(B)
A.category能夠添加新的方法;
B.category能夠刪除修改以前的方法;
C.將類的實現分散到多個不一樣文件或多個不一樣框架中;
D.建立對私有方法的前向引用;
理解:類別是一種爲現有的類添加新方法的方式。利用Objective-C的動態運行時分配機制,Category提供了一種比繼承更爲簡潔的方法來對class進行擴展,無需建立對象類的子類就能爲現有的類添加新方法,能夠爲任何已經存在的class添加方法,包括那些沒有源代碼的類(好比某些框架類),但不能刪除修改以前的方法。
類別主要有3個做用:
(1)能夠將類的實現分散到多個不一樣文件或多個不一樣框架中,方便代碼管理。也能夠對框架提供類的擴展(沒有源碼,不能修改)。
(2)建立對私有方法的前向引用。若是其餘類中的方法未實現,在你訪問其餘類的私有方法時編譯器報錯。這時使用類別,在類別中聲明這些方法(沒必要提供方法實現),編譯器就不會產生警告。
(3)向對象添加非正式協議:建立一個NSObject的類別成爲「建立一個非正式協議」,由於能夠做爲任何類的委託對象使用。
24.NSRunLoop的如下描述錯誤的是(C)
A. RunLoop並非由系統自動控制的;
B.有3類對象能夠被run loop監控:sources,timer,observers
C.線程是默認啓動run loop的;
D.NSTimer可手動添加到新建的NSRunLoop中。
理解:
A:Runloop的做用在於當有事情要作時它使當前的thread工做,沒有事情作時又使thread休眠。Runloop並非由系統自動控制的,尤爲是對那些新建的次線程須要對其進行顯示的控制。
B:有三類對象能夠被run loop監控,source,timer,observers。
C:每個線程都有本身的runloop,主線程是默認開啓的,建立的子線程是要手動開啓的,由於NSApplication 只啓動main application thread.
D:NSTimer默認添加到當前NSRunLoop中,也能夠手動指定添加到本身新建的NSRunLoop中。
25.(判斷)平鋪導航模式是在內容組織上沒有層次關係,展現的內容都放置在一個主屏幕上,採用分屏或分頁控制器進行導航,能夠左右或者上下滑動屏幕查看內容。(正確)
理解:平鋪導航模式是指內容間沒有從屬關係,主要涉及的控件UIPageControl和UIScrollView。
26. UIPopoverController控制器的經常使用方法和屬性(ABCD)
A. presentPopoverFromBarButtonItem:permittedArrowDirections:animated: 呈現Popover視圖方法;
B.dismissPopoverAnimated:關閉Popover視圖方法;
C.popoverVisible,判斷Popover視圖是否可見;
D.popoverArrawDirection,判斷Popover視圖箭頭的方向;
理解:貌似UIPopoverController在iOS9以後被Deprecated了。
27.模態視圖專用屬性有哪些?(ABCD)
A. UIModalPresentationFullScreen,全屏狀態,是默認呈現樣式,iPhone只能全屏呈現。
B.UIModalPresentationPageSheet,它的寬度是固定的768點,在iPad豎屏狀況下則全屏顯示。
C.UIModalPresentationFormSheet,它的是固定的540*620點,不管是橫屏仍是豎屏狀況下呈現尺寸都不會變化。
D.UIModalPresentationCurrentContext,它與父視圖控制器有相同的呈現方式。
28.iOS單元測試框架有哪些?(ABC)
A. OCUnit
B. GHUnit
C. OCMock
D. NSXML
理解:OCUnit和XCTest都是官方的測試框架,OCUnit過期已經被XCTest取代。
GHUnit和OCMock都是第三方的測試框架。
29.NSURLRequest的構造函數有(ABCD)
A. +requestWithURL:
B. -initWithURL;
C. requestWithURL:cachePolicy:timeoutInterval;
D.initWithURL:cachePolicy:timeoutInterval;
30.iOS 應用導航模式有哪些?(ABC)
A.平鋪導航模式;
B. 標籤導航模式;
C.樹形結構導航模式;
D.模態視圖
31.在UIViewController類中與模態視圖相關方法有哪些?(AB)
A. presentViewController:animated:completion:
B, dismissViewControllerAnimated:complation:
C.addChildViewController:
D.removeFromParentViewController.
32.iOS 中導航設計模式有幾種?(ABC)
A. 平鋪視圖;
B. 標籤視圖;
C.樹形視圖;
D.模態視圖導航;
理解:
平鋪導航:UITabBarController
標籤導航:UINavigationController
樹形導航:UIPageViewController
33.實現多線程都有哪些方法(BC)
A. 使用@synchronized(self)
B. 使用GCD
C. 使用NSOperationQueue
D.使用@thread
34.爲何說OC是runtime language?(ABD)
A. 將數據類型的肯定由編譯時,推遲到了運行時;
B.運行時機制使咱們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法;
C.若是A繼承了B,那麼在編譯時就已經生成了A的實例;
D.多態是指不一樣對象以本身的方式響應相同消息的能力;
經常使用的設計模式
• 單例模式
• 組合模式
• 觀察者模式
• 代理模式
• 享元模式
• 工廠方法模式
• 抽象工廠模式
MVC的理解
• 數據管理者(M)、數據展現者(V)、數據加工者(C)
• M應該作的事:
○ 給ViewController提供數據
○ 給ViewController存儲數據提供接口
○ 提供通過抽象的業務基本組件,供Controller調度
• C應該作的事:
○ 管理View Container的生命週期
○ 負責生成全部的View實例,並放入View Container
○ 監聽來自View與業務有關的事件,經過與Model的合做,來完成對應事件的業務。
• V應該作的事:
○ 響應與業務無關的事件,並所以引起動畫效果,點擊反饋(若是合適的話,儘可能仍是放在View去作)等。
○ 界面元素表達
MVC 和 MVVM 的區別
• MVVM是對胖模型進行的拆分,其本質是給控制器減負,將一些弱業務邏輯放到VM中處理
• MVC是一切設計的基礎,全部新的設計模式都是基於MVC進行的改進
• 補充:常見的設計模式有:MVC、MVCS、MVVM、viper
TCP和UDP有什麼區別?
• TCP是面向鏈接的,創建鏈接須要經歷三次握手,保證數據正確性和數據順序
• UDP是非鏈接的協議,傳送數據受生成速度,傳輸帶寬等限制,可能形成丟包
• UDP一臺服務端能夠同時向多個客戶端傳輸信息
• TCP報頭體積更大,對系統資源要求更多
TCP的三次握手
• 第一次握手:客戶端發送syn包到服務器,並進入syn_send狀態,等待服務器進行確認;
• 第二次握手:服務器收到客戶端的syn包,必須確認客戶的SYN,同時本身也發送一個SYN包,即SYN + ACK包,此時服務器進入SYN_RECV狀態;
• 第三次握手:客戶收到服務器發送的SYN+ACK包以後,向服務器發送確認包,此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成第三次握手。
如何製做一個靜態庫/動態庫?他們的區別是什麼?
• Xcode6支持製做靜態庫/動態庫framework
• 不管是動態庫仍是靜態庫都是區分真機和模擬器的
• 靜態庫編譯靜態庫文件裝入程序空間,動態庫是文件動態裝入內存
• 動態庫執行到相關函數纔會被調用,節省空間
• 蘋果通常不容許第三方動態庫,APP容易被拒
- 一個lib包含了不少的架構,會打到最後的包裏麼?
• 不會,若是lib中有armv7, armv7s, arm64, i386,x86_64架構,而target architecture選擇了armv7s,arm64,那麼只會從lib中link指定的這兩個架構的二進制代碼,其餘架構下的代碼不會link到最終可執行文件中;反過來,一個lib須要在模擬器環境中正常link,也得包含i386架構的指令
每個設備都有屬於本身的CPU架構
每個靜態支持的架構是固定
模擬器
4s-->5 : i386
5s-->6plus : x86_64
真機
3gs-->4s : armv7
5/5c : armv7s,靜態庫只要支持了armv7,就能夠跑在armv7s的架構上
5s-->6plus : arm64
經常使用命令總結:
使用lipo -info命令,查看指定庫支持的架構,好比UIKit框架
lipo -info UIKit.framework/UIKit
想看的更詳細的信息可使用lipo -detailed_info
lipo -detailed_info UIKit.framework/UIKit
還可使用file命令
file UIKit.framework/UIKit
合併MyLib-32.a和MyLib-64.a,可使用lipo -create命令合併
lipo -create MyLib-32.a MyLib-64.a -output MyLib.a
支持64-bit後程序包會變大麼?
• 會,支持64-bit後,多了一個arm64架構,理論上每一個架構一套指令,但相比原來會大多少還很差說
用過Core Data 或者 SQLite嗎?讀寫是分線程的嗎?遇到過死鎖沒?如何解決的?
• 用過SQLite,使用FMDB框架
• 丟給FMDatabaseQueue 或者 添加互斥鎖(NSLock/@synchronized(鎖對象))
請簡單的介紹下APNS發送系統消息的機制
• APNS優點:杜絕了相似安卓那種爲了接受通知不停在後臺喚醒程序保持長鏈接的行爲,由iOS系統和APNS進行長鏈接替代
• APNS的原理:
○ 應用在通知中心註冊,由iOS系統向APNS請求返回設備令牌(device Token)
○ 應用程序接收到設備令牌併發送給本身的後臺服務器
○ 服務器把要推送的內容和設備發送給APNS
○ APNS根據設備令牌找到設備,再由iOS根據APPID把推送內容展現
不用中間變量,用兩種方法交換A和B的值
• 方法1:
A = A + B
B = A - B
A = A - B
• 方法2:異或
A = A^B;
B = A^B;
A = A^B;