簡單面試題知識點複習 (部分)

  1. OC語言的基本特點
    oc語言室C語言的一個超集,知識在C的基礎上加了面向對象的特性;
    OC與Java語言相同都是單繼承,這一點與C++語言不同(C++多重繼承);
    OC不支持命名空間機制,取而代之的是在類名之前添加前綴,以此來區分.
  2. #include與#import的區別, #import與@class的區別
    (1). #include和#import其效果相同,只是後者不會引起交叉編譯,確保頭文件只會被導入一次;
    (2).#import會包含這個類的所有信息,包括實體變量和方法,而@class只是告訴編譯器,其後面的聲明的名稱是類的名稱,至於這些類是如何定義的,暫時不用考慮. 使用#import編譯效率高,防止相互包含的編譯錯誤;
    1. 簡述類目的優點和缺點,如果覆蓋本類或者父類的方法,會出現什麼問題?
      (1) 優點:不需要通過增加子類而增加現有類的行爲(方法),且類目中的方法與原始類方法基本沒有區別;
      (2)缺點: 無法向類目添加實例變量. 覆蓋原始類方法後,原始類的方法沒辦法調用;
  3. 簡述內存管理基本原則
    如果使用alloc,copy, 或者retain 一個對象時,你就有義務,向它發送一條release或者autorelease消息, 其他方法創建的對象,不需要由你來管理內存;
  4. 什麼是ARC技術? 與GC是否相同?
    ARC是Automatic Reference Counting的簡稱,我們稱爲自動引用計數,是iOS5.0之後推出的內存管理的新特性. 本質上還是使用引用計數來管理對象,只是我們在編寫代碼時,不需要向對象發送release或者autorelease方法,也不可以調用delloc方法,編譯器會在合適的位置自動給用戶生成release消息(autorelease);
    GC的全稱是garbage collection內存垃圾回收機制, ARC比GC性能好;

    1. iOS中是否支持垃圾回收機制
      iOS開發只支持手動內存管理與ARC,Mac開發支持GC垃圾回收機制,10.8之後棄用了GC,推薦使用ARC;

    2. 深,淺複製的基本概念以及他們的區別
      淺: 只複製對象本身,不對裏面的屬性複製;
      深:不僅複製對象本身,對象持有的屬性對象也做複製;

  5. 內存中的堆區和棧區的差別
    棧區(stack)由編譯器自動分配釋放,存放方法(函數)的參數值,局部變量的值等;
    堆區(heap)一般由程序員分配與釋放,若程序員不釋放,則內存溢出;
  6. 用戶定義了一個對象,如何實現拷貝(可變和不可變拷貝)
    必須實現copying和mutableCopying協議,表示返回一個不可變和可變的對象,否則,程序將會出現異常;
-(id)copyWithZone:(NSZone *)zone {
Person *person = [[self Class] allocWithZone:zone];
person -> age = self.age;
person -> name = self.name;
return person;
}
- (id)mutableCopyWithZone(NSZone *)zone;    
  1. 定義屬性時,什麼時候用assign,retain,copy,nonatomic
    (1)assign:普通賦值,一般常用於基本數據類型,常見委託設計模式 ,以此來防止循環引用.
    (2)retain:保留計數,獲得到了對象的所有權. 引用計數在原有基礎上加1;
    (3)用來複制對象,一般字符串使用copy,Foundation中的不可變對象使用copy效果相當於retain,只是引用計數+1;
    (4) nonatomic,非原子性訪問,不加同步,多線程併發訪問會提高性能;
  2. **strong與weak, _unsafe _unretained與weak的區別
    (1)strong叫強引用,weak叫弱引用,在ARC中,使用strong告訴編譯器幫助我們自動插入retain, weak是普通賦值相當於手動管理內存的assign;
    (2) _unsafe _unretained與weak功能一致,區別在於當指向的對象銷燬後,weak會將變量置爲nil,防止調用野指針;
    12.ARC存在內存泄露嗎
    ARC中如果內存管理不當的話,同樣會存在內存泄露,例如:ARC中也會循環引用導致內存泄露,OC對象與CoreFoundation類之間橋接時,管理不當也會產生內存泄露;
  3. 當我們釋放對象時,爲什麼需要調用[super dealloc]方法?
    因爲,子類是繼承自父類,那麼子類中有一些實例變量(對象),是繼承自父類的, 因此,我們需要調用父類方法,將父類所擁有的實例進行釋放;

  4. 自動釋放池是什麼,如何工作
    自動釋放池是NSAutorelease類的一個實例,當向一個對象發送autorelease消息時,該對象會自動入池,待池銷燬時,將會向池中所有對象發送一條release消息,釋放對象;

    1. * 爲什麼delegate屬性都是assign而不是retain的?*
      防止循環引用,以致對象無法得到正確的釋放
  5. iOS開發中數據持久化有哪幾種?
    plist文件寫入, sqlite3數據庫,coredata, writeFile
  6. 什麼是KVC和KVO?以及他們之間的關係是什麼
    (1)KVC(鍵值編碼)是一種間接訪問對象實例變量的機制, 該機制可以不通過存取方法就可以對象的實例變量;
    (2)KVO(鍵值觀察)是一種能使得對象獲取到其他對象屬性變化的通知機制;
    (3)實現KVO鍵值觀察模式,被觀察的對象必須使用KVC鍵值編碼來修改它的實例變量,這樣才能被觀察者觀察到. 因此,KVC是KVO的基礎或者說KVO的實現是建立在KVC的基礎之上的;
  7. 簡述常見的設計模式
    單例設計,代理設計,觀察者(通知),工廠方法,模板方法

    1. 內存管理在 dealloc方法中,用release方法好還是用self.xxx = nil好
      使用self.xxx = nil更好,因爲先調用了release方法, 而且還將變量設置爲nil,這樣就更安全的釋放對象,防止野指針調用;

    2. 線程與進程的區別和聯繫?
      一般的應用程序是單個進程,也有多進程(谷歌瀏覽器),進程是個靜態的容器,裏面容納了很多個線程,線程是一系列方法的線性執行路徑.

發佈了26 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章