iOS面試題4
1.類變數的@protected @private @public @package聲明各有什麼含義。
@private 作用範圍只在自身類(外界不可訪問,子類不能繼承)
@protected 作用範圍在自身類和子類,外界不可訪問,但是子類可以繼承。(如果不加修飾的話,預設就是@protected)
@public外界可以訪問,也可以被子類繼承
@package作用範圍是在某個架構內
2.簡述OC中的記憶體管理機制。與retain配對使用的方法是dealloc還是release,為什麼。需要與alloc配對使用的方法是dealloc還是release,為什麼。
readwrite readonly assign copy nonatomic atomic strong weak屬性的作用。
一、
1)記憶體回收機制(GC)系統在分配記憶體空間時,將已經被釋放的記憶體回收並重新分配,這種機制對記憶體的管理不夠及時,在OS X 10.6之後被廢棄
2)手動引用計數管理機制(MRC):由程式員負責開闢記憶體空間,並管理記憶體空間的引用計數,每引用一次就將計數器加一,不再引用時將計數器減一,當計數器為0時,回收這塊記憶體空間,這樣的機制能夠做到對記憶體的精確控制,不使用的記憶體能及時的回收,但是對程式員的要求比較高
3)自動引用計數機制:由程式員開闢記憶體空間,由編譯器幫我們在合適的敵方添加引用計數操作的代碼,不需要程式員手動管理記憶體的引用計數,使用這種機制可以精確的控制記憶體的分配與回收,還能讓程式員專心於程式的編寫而不是記憶體計數的控制。
ARC是以MRC為基礎的一種機制,ARC並不是GC
在iOS平台上,由於記憶體比較珍貴,所以ARC或者MRC來管理記憶體
二、retain對應release retain是將記憶體的引用計數加一(即對對象進行一次持有),release是將記憶體的引用計數減一(結束對對象的持有)
三、與alloc對應的方法是dealloc 因為alloc表示開闢記憶體空間,建立對象,dealloc表示回收記憶體空間,釋放對象
readwrite 可讀可寫 編譯器會自動合成setter和getter方法
readonly 唯讀,編譯器會自動合成getter方法,不會合成setter方法
assign 修飾基礎資料型別 (Elementary Data Type)和結構體類型,不會操作記憶體的引用計數
retain 修飾OC中的對象,會對引用計數進行操作,防止持有的對象不會被意外回收
copy 使用copy修飾的屬性所對應的讀寫方法中會將將要持有的對象拷貝一份,並持有對象的副本而不是原對象。可變對象是深拷貝,開闢新的記憶體空間將原對象拷貝到新的空間中;不可變對象是淺拷貝,只拷貝對象的記憶體位址。
atomic 原子特性 在多線程下保證在同一時刻只有一條線程修改訪問對應的執行個體變數
nonatomic 非原子特性 不保證多線程下的安全執行緒
strong ARC中相當於MRC中的retain,會操作記憶體的引用計數
weak ARC中相當於MRC中的assign 不僅不會操作記憶體的引用計數,而且在對象被回收後,會將指標置為nil,防止野指標的出現。
3.ViewController的alloc,loadview ,viewDidLoad,viewWillAppear,dealloc,init分別是在什麼時候調用的。在自訂viewController的時候這幾個函數應該做什麼工作。
alloc 建立對象,分配記憶體空間
init 初始化對象,初始化資料時候調用
loadview 從nib載入視圖,通常這一步不需要去幹涉,除非你沒有使用xib檔案建立視圖
viewDidLoad 載入完成 可以進行自訂資料以及動態建立其他控制項
viewWillAppear 視圖將出現在螢幕之前,馬上這個視圖就會被展現在螢幕上了
4.線程是什麼。進程是什麼。二者有什麼區別和聯絡。
進程:一個程式對一個資料集的動態執行過程,是分配資源的基本單位
線程:一個進程內的基本調度單位
線程的劃分尺度小於進程,一個進程包含一個或者更多地線程。
5 Runloop是什麼。
Runloop 是線程的基礎架構部分。一個Runloop就是一個事件處理迴圈,用來不停地調配工作以及處理輸入事件。使用Runloop的目的是是你的線程在有工作的時候工作,沒有的時候休眠。
Runloop的管理並不完全是自動的。你仍必須設計你的線程代碼以在適當的時候啟動Runloop並正確相應輸入事件。Cocoa和CoreFoundation都提供了Runloop對象方便配置和管理線程的Runloop。你建立的程式不需要顯式的建立Runloop,每個線程,包括程式的主線程(main thread)都有與之相應的Runloop對象。但是自己建立的子線程是需要手動運行Runloop的,在carbon和cocoa的程式中,程式啟動時候,主線程會自行建立並運行Runloop.
著作權聲明:本文由http://www.bestnathan.com/原創,歡迎轉載分享。請尊重作者勞動,轉載時保留該聲明和作者部落格連結,謝謝