e3dc73ccba705dd6cc60b31dc478d44d.jpg
1、#import 跟 #include 有什么區(qū)別姿骏,@class呢阀溶,#import<> 跟 #import<>有什么區(qū)別身冬?
#include
C語言中引入一個頭文件筐摘,但是可能出現(xiàn)交叉編譯
#import
在OC中引入自己創(chuàng)建的頭文件#import””
或者系統(tǒng)框架#import<>
卒茬。
#import
不會出現(xiàn)交叉編譯,@class
對一個類進行聲明,告訴編譯器有這個類咖熟,但是類的定義什么的都不知道
@class
的作用是告訴編譯器有@class
后面的內(nèi)容是一個類名扬虚。只是告訴編譯器存在這么一個類,類具體包含哪些方法球恤,屬性和變量的并沒有告訴編譯器。一般在類的頭文件中使用@class
來引入其他類荸镊。
2咽斧、描述一下KVO 和 KVC?
Key-Value Observing (簡寫為KVO):當指定的對象的屬性被修改了躬存,允許對象接受到通知的機制张惹。每次指定的被觀察對象的屬性被修改的時候,KVO都會自動的去通知相應的觀察者岭洲。
KVC是KeyValue Coding的簡稱宛逗,它是一種可以直接通過字符串的名字(key)來訪問類屬性的機制。而不是通過調(diào)用Setter盾剩、Getter方法訪問雷激。
3替蔬、類目和繼承地區(qū)別
1.類別是對方法的擴展,不能添加成員變量屎暇。繼承可以在原來父類的成員變量的基礎(chǔ)上承桥,添加新的成員變量
2.類別只能添加新的方法,不能修改和刪除原來的方法根悼。繼承可以增加凶异、修改和刪除方法。
3.類別不提倡對原有的方法進行重載挤巡。繼承可以通過使用super
對原來方法進行重載剩彬。
4.類別可以被繼承,如果一個父類中定義了類別矿卑,那么其子類中也會繼承此類別喉恋。
4、簡述你對UIView粪摘、UIWindow瀑晒、CALayer的理解。
CALayer是圖層類徘意,本身可以顯示的苔悦,但是不能響應事件。
UIView是iOS系統(tǒng)中界面元素的基礎(chǔ)椎咧,所有的界面元素都繼承自它玖详。事件的處理由它來執(zhí)行,但是顯示其實是由其對應的layer
層來操作的勤讽,UIView內(nèi)嵌了一個layer
蟋座,layer
顯示內(nèi)容,UIView本身增加了事件處理的功能脚牍。
UIWindow繼承自UIView向臀,主要的作用是作為窗口呈現(xiàn)其他的視圖。而且一個應用程序一般情況下只有一個窗口诸狭。
5券膀、do while和while do 的區(qū)別?
while
語句是先測試條件再執(zhí)行語句,條件不符后終止
do while
語句是先執(zhí)行語句再測試條件,條件不符后終止,所以do while
循環(huán)至少執(zhí)行一次
6驯遇、nil,NSNULL,NULL 區(qū)別
nil定義一個實例為空, 指向oc中對象的空指針.是對objective c id
對象賦空值芹彬,對于objective c
集合類對象 比如數(shù)組對象,字典對象叉庐,當我們不需要再使用他們的時候舒帮,對他們release
的同時最好也把他們賦值為nil
,這樣確保安全性,如果不賦值nil
玩郊,可能導致程序崩潰
NSNull類定義了一個單例對象用于表示集合對象的空值
集合對象無法包含nil作為其具體值肢执,如NSArray
、NSSe
t和NSDictionary
瓦宜。相應地蔚万,nil值用一個特定的對象NSNull
來表示。NSNull
提供了一個單一實例用于表示對象屬性中的的nil值临庇。默認的實現(xiàn)方法中反璃,dictionaryWithValuesForKeys:
和setValuesForKeysWithDictionary:
自動地將NSNull
和nil
相互轉(zhuǎn)換,因此您的對象不需要進行NSNull
的測試操作假夺。
NULL可以用在C語言的各種指針上,在Objective-C里淮蜈,nil對象被設(shè)計來跟NULL空指針關(guān)聯(lián)的。他們的區(qū)別就是nil是一個對象已卷,而NULL只是一個值梧田。而且我們對于nil調(diào)用方法,不會產(chǎn)生crash
或者拋出異常.
7侧蘸、內(nèi)存中的棧和堆的區(qū)別是什么裁眯?哪些數(shù)據(jù)在棧上哪些數(shù)據(jù)在堆上?
1.管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生 memory leak
讳癌。
2.申請大小:能從棧獲得的空間較小,堆是向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域穿稳。堆的大小受限于計算機系統(tǒng)中 有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大晌坤。
3.碎片問題:對于堆來講,頻繁的new/delete
勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低逢艘。 對于棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個內(nèi)存塊 從棧中間彈出
4.分配方式:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配骤菠。靜態(tài)分配是編譯器完成 的,比如局部變量的分配它改。動態(tài)分配由 alloca函數(shù)進行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器 進行釋放,無需我們手工實現(xiàn)。
5.分配效率:棧是機器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧 都有專門的指令執(zhí)行,這就決定了棧的效率比較高商乎。堆則是C/C++函數(shù)庫提供的,它的機制是很復雜的央拖。
在函數(shù)體中定義的變量通常是在棧上,用malloc
, calloc
, realloc
等分配內(nèi)存的函數(shù)分配得到的就是在堆上
8鹉戚、淺復制和深復制的區(qū)別
淺層復制:只復制指向?qū)ο蟮闹羔?而不復制引用對象本身鲜戒。
深層復制:復制引用對象本身。
意思就是說我有個A對象,復制一份后得到A_copy對象后,對于淺復制來說,A和A_copy指向的是同一 個內(nèi)存資源,復制的只不過是是一個指針,對象本身資源 還是只有一份,那如果我們對A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對象同樣被修改,這其實違背 了我們復制拷貝的一個思想崩瓤。深復制就好理解了,內(nèi)存中存在了
兩份獨立對象本身。
用網(wǎng)上一哥們通俗的話將就是:
淺復制好比你和你的影子,你完蛋,你的影子也完蛋
深復制好比你和你的克隆人,你完蛋,你的克隆人還活著踩官。
深淺拷貝前提是:是實現(xiàn)NSCopying
或者NSMutableCopying
協(xié)議却桶。
淺拷貝只是復制對象本身,對象的屬性和包含的對象不做復制。
深拷貝則對對象本身復制颖系,同時對對象的屬性也進行復制嗅剖。
深淺拷貝的本質(zhì)區(qū)別是對象或者對象屬性的內(nèi)存地址是否一樣,一樣則為淺拷貝嘁扼,不一樣則為深拷貝信粮。
Foundation
框架支持復制的類,默認是淺拷貝趁啸。其中對Foundation
中不可變的對象進行copy
時作用相當于retain
强缘。
而如果是mutablecopy
時,無論對象是否可變不傅,副本是可變的旅掂,并且實現(xiàn)了真正意義上的copy。如果對可變對象進行copy访娶,
副本對象是不可變的商虐,同樣是真正意義上的copy。
9崖疤、UITableView的執(zhí)行流程是怎么樣的秘车?
第一輪:
1、numberOfSectionsInTableView
:假如section=2劫哼,此函數(shù)只執(zhí)行一次叮趴,假如section=0,下面函數(shù)不執(zhí)行沦偎,默認為1
2疫向、heightForHeaderInSection
,執(zhí)行兩次豪嚎,此函數(shù)執(zhí)行次數(shù)為section數(shù)目
3搔驼、heightForFooterInSection
,函數(shù)屬性同上侈询,執(zhí)行兩次
4舌涨、numberOfRowsInSection
,此方法執(zhí)行一次
5扔字、heightForHeaderInSection
囊嘉,此方法執(zhí)行了兩次,我其實有點困惑為什么這里還要調(diào)用這個方法
6革为、heightForFooterInSection
扭粱,此方法執(zhí)行兩次,
7震檩、numberOfRowsInSection
琢蛤,執(zhí)行一次
8蜓堕、heightForRowAtIndexPath
,行高博其,先執(zhí)行section=0套才,對應的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被描畫完畢