iOS基礎筆試題-(2)

來源:互聯網
上載者:User

標籤:

12. obj在編譯時間和運行時分別時什麼類型的對象

如下面的代碼,obj在編譯時間和運行時分別時什麼類型的對象:

 
123  NSString *obj = [[NSData alloc] init]; 

參考答案:

在編譯時間,我們所聲明的objNSString *類型,因此是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是具備運行時特性的,因此在連結時,通過idisa指標可以找到其所屬的類,因此最終類型還是通過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的區別

參考答案:

nilC語言的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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.