iOS關(guān)鍵字知識(shí)點(diǎn)

e3dc73ccba705dd6cc60b31dc478d44d.jpg

1、#import 跟 #include 有什么區(qū)別,@class呢,#import<> 跟 #import<>有什么區(qū)別?

#include C語言中引入一個(gè)頭文件,但是可能出現(xiàn)交叉編譯
#import在OC中引入自己創(chuàng)建的頭文件#import””或者系統(tǒng)框架#import<>。
#import不會(huì)出現(xiàn)交叉編譯,@class對(duì)一個(gè)類進(jìn)行聲明,告訴編譯器有這個(gè)類,但是類的定義什么的都不知道
@class的作用是告訴編譯器有@class后面的內(nèi)容是一個(gè)類名。只是告訴編譯器存在這么一個(gè)類,類具體包含哪些方法,屬性和變量的并沒有告訴編譯器。一般在類的頭文件中使用@class來引入其他類。


2、描述一下KVO 和 KVC?

Key-Value Observing (簡(jiǎn)寫為KVO):當(dāng)指定的對(duì)象的屬性被修改了,允許對(duì)象接受到通知的機(jī)制。每次指定的被觀察對(duì)象的屬性被修改的時(shí)候,KVO都會(huì)自動(dòng)的去通知相應(yīng)的觀察者。
KVC
KeyValue Coding
的簡(jiǎn)稱,它是一種可以直接通過字符串的名字(key)來訪問類屬性的機(jī)制。而不是通過調(diào)用Setter、Getter方法訪問。


3、類目和繼承地區(qū)別

1.類別是對(duì)方法的擴(kuò)展,不能添加成員變量。繼承可以在原來父類的成員變量的基礎(chǔ)上,添加新的成員變量
2.類別只能添加新的方法,不能修改和刪除原來的方法。繼承可以增加、修改和刪除方法。
3.類別不提倡對(duì)原有的方法進(jìn)行重載。繼承可以通過使用super對(duì)原來方法進(jìn)行重載。
4.類別可以被繼承,如果一個(gè)父類中定義了類別,那么其子類中也會(huì)繼承此類別。


4、簡(jiǎn)述你對(duì)UIView、UIWindow、CALayer的理解。

CALayer是圖層類,本身可以顯示的,但是不能響應(yīng)事件。
UIViewiOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都繼承自它。事件的處理由它來執(zhí)行,但是顯示其實(shí)是由其對(duì)應(yīng)的layer層來操作的,UIView內(nèi)嵌了一個(gè)layerlayer顯示內(nèi)容,UIView本身增加了事件處理的功能。
UIWindow繼承自UIView,主要的作用是作為窗口呈現(xiàn)其他的視圖。而且一個(gè)應(yīng)用程序一般情況下只有一個(gè)窗口。


5、do while和while do 的區(qū)別?

while語句是先測(cè)試條件再執(zhí)行語句,條件不符后終止
do while語句是先執(zhí)行語句再測(cè)試條件,條件不符后終止,所以do while循環(huán)至少執(zhí)行一次


6、nil,NSNULL,NULL 區(qū)別

nil定義一個(gè)實(shí)例為空, 指向oc中對(duì)象的空指針.是對(duì)objective c id對(duì)象賦空值,對(duì)于objective c 集合類對(duì)象 比如數(shù)組對(duì)象,字典對(duì)象,當(dāng)我們不需要再使用他們的時(shí)候,對(duì)他們release 的同時(shí)最好也把他們賦值為nil,這樣確保安全性,如果不賦值nil,可能導(dǎo)致程序崩潰

NSNull類定義了一個(gè)單例對(duì)象用于表示集合對(duì)象的空值
集合對(duì)象無法包含nil作為其具體值,如NSArray、NSSet和NSDictionary。相應(yīng)地,nil值用一個(gè)特定的對(duì)象NSNull來表示。NSNull提供了一個(gè)單一實(shí)例用于表示對(duì)象屬性中的的nil值。默認(rèn)的實(shí)現(xiàn)方法中,dictionaryWithValuesForKeys:setValuesForKeysWithDictionary:自動(dòng)地將NSNullnil相互轉(zhuǎn)換,因此您的對(duì)象不需要進(jìn)行NSNull的測(cè)試操作。

NULL可以用在C語言的各種指針上,在Objective-C里,nil對(duì)象被設(shè)計(jì)來跟NULL空指針關(guān)聯(lián)的。他們的區(qū)別就是nil是一個(gè)對(duì)象,而NULL只是一個(gè)值。而且我們對(duì)于nil調(diào)用方法,不會(huì)產(chǎn)生crash或者拋出異常.


7、內(nèi)存中的棧和堆的區(qū)別是什么?哪些數(shù)據(jù)在棧上哪些數(shù)據(jù)在堆上?

1.管理方式:對(duì)于棧來講,是由編譯器自動(dòng)管理,無需我們手工控制;對(duì)于堆來說,釋放工作由程序員控制,容易產(chǎn)生 memory leak
2.申請(qǐng)大小:能從棧獲得的空間較小,堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。堆的大小受限于計(jì)算機(jī)系統(tǒng)中 有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。
3.碎片問題:對(duì)于堆來講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。 對(duì)于棧來講,則不會(huì)存在這個(gè)問題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊 從棧中間彈出
4.分配方式:堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成 的,比如局部變量的分配。動(dòng)態(tài)分配由 alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器 進(jìn)行釋放,無需我們手工實(shí)現(xiàn)。
5.分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧 都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的。
在函數(shù)體中定義的變量通常是在棧上,用malloc, calloc, realloc等分配內(nèi)存的函數(shù)分配得到的就是在堆上


8、淺復(fù)制和深復(fù)制的區(qū)別

淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔?而不復(fù)制引用對(duì)象本身。
深層復(fù)制:復(fù)制引用對(duì)象本身。
意思就是說我有個(gè)A對(duì)象,復(fù)制一份后得到A_copy對(duì)象后,對(duì)于淺復(fù)制來說,A和A_copy指向的是同一 個(gè)內(nèi)存資源,復(fù)制的只不過是是一個(gè)指針,對(duì)象本身資源 還是只有一份,那如果我們對(duì)A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對(duì)象同樣被修改,這其實(shí)違背 了我們復(fù)制拷貝的一個(gè)思想。深復(fù)制就好理解了,內(nèi)存中存在了

兩份獨(dú)立對(duì)象本身。
用網(wǎng)上一哥們通俗的話將就是:
淺復(fù)制好比你和你的影子,你完蛋,你的影子也完蛋
深復(fù)制好比你和你的克隆人,你完蛋,你的克隆人還活著。

深淺拷貝前提是:是實(shí)現(xiàn)NSCopying或者NSMutableCopying協(xié)議。
淺拷貝只是復(fù)制對(duì)象本身,對(duì)象的屬性和包含的對(duì)象不做復(fù)制。
深拷貝則對(duì)對(duì)象本身復(fù)制,同時(shí)對(duì)對(duì)象的屬性也進(jìn)行復(fù)制。
深淺拷貝的本質(zhì)區(qū)別是對(duì)象或者對(duì)象屬性的內(nèi)存地址是否一樣,一樣則為淺拷貝,不一樣則為深拷貝。
Foundation框架支持復(fù)制的類,默認(rèn)是淺拷貝。其中對(duì)Foundation中不可變的對(duì)象進(jìn)行copy時(shí)作用相當(dāng)于retain
而如果是mutablecopy時(shí),無論對(duì)象是否可變,副本是可變的,并且實(shí)現(xiàn)了真正意義上的copy。如果對(duì)可變對(duì)象進(jìn)行copy,
副本對(duì)象是不可變的,同樣是真正意義上的copy。


9、UITableView的執(zhí)行流程是怎么樣的?

第一輪:
1、numberOfSectionsInTableView :假如section=2,此函數(shù)只執(zhí)行一次,假如section=0,下面函數(shù)不執(zhí)行,默認(rèn)為1
2、heightForHeaderInSection ,執(zhí)行兩次,此函數(shù)執(zhí)行次數(shù)為section數(shù)目
3、heightForFooterInSection ,函數(shù)屬性同上,執(zhí)行兩次
4、numberOfRowsInSection ,此方法執(zhí)行一次
5、heightForHeaderInSection ,此方法執(zhí)行了兩次,我其實(shí)有點(diǎn)困惑為什么這里還要調(diào)用這個(gè)方法
6、heightForFooterInSection ,此方法執(zhí)行兩次,
7、numberOfRowsInSection,執(zhí)行一次
8、heightForRowAtIndexPath ,行高,先執(zhí)行section=0,對(duì)應(yīng)的row次數(shù)

第二輪:
1、numberOfSectionsInTableView ,一次
2、heightForHeaderInSection ,section次數(shù)
3、heightForFooterInSection ,section次數(shù)
4、numberOfRowsInSection ,一次
5、heightForHeaderInSection ,執(zhí)行section次數(shù)
6、heightForFooterInSection,執(zhí)行section次數(shù)
7、numberOfRowsInSection,執(zhí)行一次
8、heightForRowAtIndexPath,行高,先執(zhí)行一次
9、cellForRowAtIndexPath
10、willDisplayCell
然后8、9、10依次執(zhí)行直到所有的cell被描畫完畢


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)鍵詞/關(guān)鍵類 1.#import跟#include有什么區(qū)別,@class呢,#import<>跟#import...
    丶逐漸閱讀 1,612評(píng)論 0 1
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,655評(píng)論 30 472
  • 37.cocoa內(nèi)存管理規(guī)則 1)當(dāng)你使用new,alloc或copy方法創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象的保留計(jì)數(shù)器值為1...
    如風(fēng)家的秘密閱讀 961評(píng)論 0 4
  • 1.OC的類可以多重繼承嗎?可以實(shí)現(xiàn)多個(gè)接口嗎?要想實(shí)現(xiàn)類似多重繼承如何實(shí)現(xiàn)?答:OC不可以實(shí)現(xiàn)多重繼承。可以實(shí)現(xiàn)...
    歐辰_OSR閱讀 2,161評(píng)論 0 30
  • 產(chǎn)品功能:步行導(dǎo)航。 所解決的問題:地圖盲,不分南北,導(dǎo)航最后一公里。 產(chǎn)品差異化:使用攝像頭,有點(diǎn)現(xiàn)實(shí)增強(qiáng)的感覺...
    性感瓶底兒閱讀 3,303評(píng)論 1 5

友情鏈接更多精彩內(nèi)容