1.簡述你對UIView、UIWindow和CALayer的理解?
UIView:屬于UIkit.framework框架,負(fù)責(zé)渲染矩形區(qū)域的內(nèi)容,為矩形區(qū)域添加動畫,響應(yīng)區(qū)域的觸摸事件,布局和管 理一個或多個子視圖 ;
UIWindow:屬于UIKit.framework框架,是一種特殊的UIView,通常在一個程序中只會有一個UIWindow,但可以手 動創(chuàng)建多個UIWindow,同時加到程序里面。UIWindow在程序中主要起到三個作用:? 1、作為容器,包含app所要顯示的所有視圖 2、傳遞觸摸消息到程序中view和其他對象 3、與UIViewController協(xié)同工作,方便完成設(shè)備方向旋轉(zhuǎn)的支持??
CAlayer:屬于QuartzCore.framework,是用來繪制內(nèi)容的,對內(nèi)容進行動畫處理依賴與UIView來進行顯示,不能處 理用戶事件。UIView和CALayer是相互依賴的,UIView依賴CALayer提供內(nèi)容,CALayer依賴UIView一共容器顯示 繪制內(nèi)容。
延伸: UIViewController:管理視圖的子視圖,每個視圖控制器都有一個自帶的視圖,并且負(fù)責(zé)這個視圖相關(guān)的一切事務(wù)。方便 管理視圖中的子視圖,負(fù)責(zé)model與view的通信;檢測設(shè)備旋轉(zhuǎn)以及內(nèi)存警告;是所有視圖控制類的積累,定義了控制器 的基本功能。?
2.為什么很多內(nèi)置類如UITableViewController的delegate屬性都是assign而不是retain的???
會引起循環(huán)引用----若是retain,在alloc一次之后,若release一次,會導(dǎo)致內(nèi)訓(xùn)泄漏,若release兩次會導(dǎo)致兩個對象的dealloc嵌套執(zhí)行,結(jié)果就是都沒有執(zhí)行成功,最后崩潰! 所有的引用計數(shù)系統(tǒng),都存在循環(huán)應(yīng)用的問題。例如下面的引用關(guān)系:??
對象a創(chuàng)建并引用到了對象b. * 對象b創(chuàng)建并引用到了對象c. * 對象c創(chuàng)建并引用到了對象b.? 這時候b和c的引用計數(shù)分別是2和1。 當(dāng)a不再使用b,調(diào)用release釋放對b的所有權(quán),因為c還引用了b,所以b的引用計數(shù)為1,b不會被釋放。 b不釋放,c的引用計數(shù)就是1,c也不會被釋放。從此,b和c永遠(yuǎn)留在內(nèi)存中。 這種情況,必須打斷循環(huán)引用,通過其他規(guī)則來維護引用關(guān)系。
我們常見的delegate往往是assign方式的屬性而不是 retain方式 的屬性,賦值不會增加引用計數(shù),就是為了防止delegation兩端產(chǎn)生不必要的循環(huán)引用。 如果一個UITableViewController 對象a通過retain獲取了UITableView對象b的所有權(quán),這個UITableView對象b的 delegate又是a,如果這個delegate是retain方式的,那基本上就沒有機會釋放這兩個對象了。自己在設(shè)計使用 delegate模式時,也要注意這點。?
3.簡述NotificationCenter、KVC、KVO、Delegate?并說明它們之間的區(qū)別???
Notification 是觀察者模式的實現(xiàn),KVO是觀察者模式的OB-C底層實現(xiàn)。NOtification 通過 Notifydcation addobserver 和 remove observer 工作。
KVO是鍵值監(jiān)聽,鍵值觀察機制,提供了觀察某一屬性變化的方法
KVC是鍵值編碼,是一種間接訪問對象的屬性,使用字符串來標(biāo)示屬性(例如:setValue:forKey:)?
Delegate:把某個對象要做的事情委托給別的對象去做。那么別的對象就是這個對象的代理,代替它來打理要做的 事。反映到程序中,首先要明確一個對象的委托方是哪個對象,委托所做的內(nèi)容是什么。
4.線程與進程的區(qū)別和聯(lián)系??
線程是進程的基本單位 進程和線程都是由操作系統(tǒng)所體會的程序運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。 進程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下 不會對其它進程產(chǎn)生影響,而線程只是一個進程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的 地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較 大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進程
5.簡述多線程的作用以及什么地方會用到多線程?OC實現(xiàn)多線程的方法有哪些?談?wù)劧嗑€程安全問題的幾種解決方案?何為線程同步,如何實現(xiàn)的?分線程回調(diào)主線程方法是什么,有什么作用?
(1)、多線程的作用:可以解決負(fù)載均衡問題,充分利用cpu資源 。為了提高CPU的使用率,采用多線程的方式去同時完 成幾件事情而互不干擾,??
(2)、大多情況下,要用到多線程的主要是需要處理大量的IO操作時或處理的情況需要花大量的時間等等,比如:讀寫文 件、視頻圖像的采集、處理、顯示、保存等。??
(3)、ios有三種主要方法:1、NSThread。2、NSOperation。3、GCD。?
(4)解決方案:使用鎖:鎖是線程編程同步工具的基礎(chǔ)。鎖可以讓你很容易保護代碼中一大塊區(qū)域以便你可以確保代碼的正 確性。使用NSLock類;使用@synchronized指令等。??
(5)回到主線程的方法: dispatch_async(dispatch_get_main_queue(), ^{ });??
作用:主線程是顯示UI界面,子線程多數(shù)是進行數(shù)據(jù)處理