標籤:
12. obj在編譯時間和運行時分別時什麼類型的對象
如下面的代碼,obj在編譯時間和運行時分別時什麼類型的對象:
| 123 |
NSString *obj = [[NSData alloc] init]; |
參考答案:
在編譯時間,我們所聲明的obj是NSString *類型,因此是NSString類型對象。在運行時,由於指標obj所指向的是NSData類型對象的記憶體,因此實際上是NSData類型的對象。在編譯時間,這一行代碼會轉換成類似這樣:
| 1234 |
NSString *obj = ((id (*)(id, SEL))objc_msgSend)([NSData class], @selector(alloc));obj = ((id (*)(id, SEL))objc_msgSend)((id)obj, @selector(init)); |
由於在編譯時間,轉換成id,因此可以用NSString *指向NSData對象,而id是具備運行時特性的,因此在連結時,通過id的isa指標可以找到其所屬的類,因此最終類型還是通過isa確定其所屬類型。
13. id聲明的對象有什麼特性?
id類型可以指向任何類型的對象。
參考答案:
我們先看看其定義:
| 123456789 |
/// Represents an instance of a class.struct objc_object { Class isa OBJC_ISA_AVAILABILITY;}; /// A pointer to an instance of a class.typedef struct objc_object *id; |
可其定義可知id類型是一個指向objc_object結構體類型的指標,這個結構體只有一個指向對象無類的指標isa,因此id可以指向任何類型的對象,故其具備運行時特性。
14. iOS裝置效能測試
在實際開發中,我們經常需要對應用瘦身,因此對效能的檢測是很重要的。
參考答案:
使用Profile-> Instruments ->Time Profiler可以檢測效能。
15. Objective-C中有私人方法、私人變數嗎?
我記得曾經我就被這麼問過,不知道大家有沒有遇到過。
參考答案:
在類的.m實現檔案內聲明,就可以作為私人方法、私人變數。但是,並不是絕對的私人,如果外部知道有這麼個方法,一樣可以調用,而且不會報錯。就像蘋果公司沒有公開出來的API,只要我們通過其它方式瞭解到api就可以調用。於是蘋果審核時經常由於使用了私人api而打回來了。
16. 簡述tableview的重用機制
曾經筆者面試時,也被問到這個問題。
參考答案:
| 123 |
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] |
- 這個方法就是重用機制的核心了。比如,有一個介面可顯示10個cell,那麼建立10次cell,並給
cell指定同樣的重用標識(當然,可以為不同顯示類型的cell指定不同的標識)並且10個cell將全部都加入到visiableCells數組,reusableTableCells為空白.
- 滾動
tableView,當有一個cell完全移出螢幕時,這個cell就會被加入到reusableTableCells。而新出現的那個cell將加入到visiableCells,而這個cell就是被重用的。
如果要讓tableview不重用,不設定reuseIdentifier就可以了。
17. nil與NULL的區別
參考答案:
nil和C語言的NULL相同,在objc/objc.h中定義。nil表示Objective-C對象的值為空白。在C語言中,指標的空值用NULL表示。在Objective-C中,nil對象調用任何方法表示什麼也不執行,也不會崩潰。
更詳細請閱讀筆者的文章:http://www.henishuo.com/nil-nil-null-nsnull-difference/
18. Category是什麼,何時使用?
參考答案:
Category就是所謂的擴充。
有時我們需要在一個已經定義好的類中增加一些方法,而不想去重寫該類,這時候使用擴充就很好。比如,當工程已經很大,代碼量比較多,或者類中已經有很多方法,已經有其他代碼調用了該類建立對象並使用該類的方法時,可以使用類別對該類擴充新的方法。
筆者所到公司之處,都會根據公司的UI風格定製一套UI組件,統一全域的風格。本人向來不喜歡用xib/storyboard開發,因為維護成本太高了。我們不能通過繼承的方式定製各種組件吧?所以這個時候使用擴充是最佳時期。
19. 什麼是Delegate?常用情境?
參考答案:
Delegate就是所謂的代理,代理是一種設計模式。在iOS開發中,會使用到大量的代理,而代理設計模式是蘋果中的標準設定模式。
常用情境有反向傳值。比如:蘋果的藍芽,我們進入到下一個介面去開啟或者關閉藍芽,當操作之後需要將狀態反饋到前一個介面,並更新顯示。對於這種狀態,使用代理設計模式是很標準的模式。
20. 什麼是單例,如何設計單例?
參考答案:
單例就是全域都只有一個對象存在,而且是在整個App運行過程中都存在。每個App都會有單例,比如UIApplication。而我們在做使用者資料存放區時,通常都會用單例儲存,因為應用在所有操作中,經常要求先登入。
下面這種寫法是最常用的寫法,這個是安全執行緒的。
| 12345678910111213 |
+ (instancetype)shared { static HYBUserManager *sg_userManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (sg_userManager == nil) { sg_userManager = [[HYBUserManager alloc] init]; } }); return sg_userManager;} |
21. 什麼是通知?
參考答案:
在iOS中,通知是非常常用的設計模式。它是多對多的關係。關於通知,由於這一節比較重要,單獨寫成一篇文章,在我的隨筆中有詳細的解釋,感興趣的可以前去看一看。
寫在最後
文章中難免有說得不合理的地方,如果您認為說法不正確或者哪裡有錯誤的地方,請在評論中留言,筆者會在第一時間修正!!!
iOS基礎筆試題-(2)