iOS軟件工程師必須會的面試題

1.請簡述你對協議的理解
    協議是oc的一種寫法, 和現實生活中的 勞動合同 協議 等是相似的, 主要目的是來規範對象的藉口 , 只有方法的聲明 ,實現是在遵守協議的類中  協議的方法分爲必須實現和可選實現 , 規範不同類的行爲  統一藉口 (繼承也可以達到統一接口的)

2.如何理解ARC自動引用計數機制
    ARC 是iOS中的內存管理機制  iOS 4 之後的 的一種自動管理方式  從iOS  不需要手動添加  retuin  +1  編譯器會幫我們添加 Autorelease //NSAutoreleasePool *pool;-->arc下不能寫 不能手動的調用 dealloc

3.如何理解 retain/copy/assign/release/autor elease/dealloc關鍵字
    retain 使對象的引用的計算+1 ;
     retain  使 對象的引用計數+1  
    copy 使 copy 對象調用copy的方法必須遵守nscopy  和nsmutablecopy  協議 方法
    assign 是直接賦值    不會使對象的引用計數減一 +1  ,
    release 是 事對象的引用計數減一 釋放對象  
    autorelease  是延遲釋放  ,他會把對象的地址放到離他最近的自動釋放池中 沒有-1 功能
    dealloc 是銷燬對象 當我們的對象的引用計數減到0 的時候  會自動調用dealloc 銷燬對象
           mvvm
4 .簡述self.name  =  xxx 與 _name  = xxx 的區別
    (1)self.name  有getter 和sett er 方法
    (2)self.name 可以被kvo 監聽到  (set 方法 和kvc方法)
    (3)self.name  考慮了內存管理  是一個對象指針
5.簡述類別和繼承 有什麼聯繫 和區別
    類別:增加方法 可以打補丁 (不可增加成員變量,但可以通過運行時的方法)
    繼承: 子類繼承父類 子類  會擁有父類所以的方法
6. str    ong 好weak 的理解
        strong和weak是arc 自動內存管理的方法 strong 是強應用 可使對象的引用計數+1 , weak是弱引用 指針 所修飾的對象指針之接賦值,weak修飾的指針 在對象銷燬的時候 指針賦值爲nil
7. 簡述weak和assign 有神馬區別
    weak 修飾對象地址  - arc 語法, 在arc 中修飾對象 ,
    assign 直接賦值 ,一般修飾基本數據類型 assign  mrc 裏既能修飾對象,也能修飾基本數據類型 , assign 在arc中只 修飾 基本數據類型
8. 如何實現ARC 和 MRC 的混合編程
    如果在ARC 工程中 加MRC   加 -fno-objc-arc
    如果在MRC 工程中 加 ARC  加 -fobjc-arc
9.oc 支持多繼承嗎
    不支持,但是可以通過協議來 實現這樣的效果
10. OC 中變量默認是私有的嗎 方法默認是私有的嗎?
    (1)oc 中的變量默認是私有的  @pro
    (2)方法是共有的  對外不公開的可以通過選擇器來實現 訪問 , 這是oc的動態特性
    (3)如果想要實現的話 , 可以通過把他放在匿名內別裏
11. #import .h  和#include 和@class  區別
    #include是c 的頭文件 通常需要#ifnodef  和 #endif 條件編譯  如果不進行條件編譯的話 , 就會造成 多次包含這個頭文件 ,從而導致 重複定義
    #import只會編譯一次 ,可以確保頭文件只會被導入一次
    @class 是前向引用聲明  告訴編譯器我後面有定義,放行
12.簡述頁面傳值有哪些
    (1)屬性傳值:prote
    (2)代理,單例 ,  block,通知


20. 簡述UITableView 的cell的複用機制
 //在使用cell 的時候我們一般都採用cell 複用機制 這樣可以提高效率 節省空間
    /*
     1.飯店 就餐  碗筷  採用複用
     2.學生 教室裏的電腦
     3.打飛機 中 子彈 循環複用
     */
    //可複用標識符
    static NSString *cellID = @"cellID";
    
    /*
     每次獲取cell 先從可複用cell隊列中獲取,如果有可複用的那麼就利用這個cell,如果沒有可複用的再創建新的cell
     //剛開始可複用隊列中是沒有可複用的cell 的
     //創建 一屏+1個就夠了
     當一個cell 從屏幕上看不到的時候就會把這個cell放入複用隊列中
    
22.  



四 . 高頻題目
    
1.蘋果移動開發框架 cocoaTouch / cocoa
 
//////////////////////////////////////////////////////////////////////////////////////////////
  1. oc 語言的基本特點
    (1)oc做爲一門面向對象的語言 自然具有面向對象的語言特性,如封裝、繼承、多態。他具有靜態語言的特性(如C++),又有動態語言的效率(動態綁定、動態加載等)。整體來說,確實是一門不錯的編程語言
現在,讓我來想想OC的動態語言特性。OC的動態特性表現爲了三個方面:動態類型、動態綁定、動態加載。之所以叫做動態,是因爲必須到運行時(run time)纔會做一些事情。
(1)動態類型
動態類型,說簡單點就是id類型。動態類型是跟靜態類型相對的。像內置的明確的基本類型都屬於靜態類型(int、NSString等)。靜態類型在 編譯的時候就能被識別出來。所以,若程序發生了類型不對應,編譯器就會發出警告。而動態類型就編譯器編譯的時候是不能被識別的,要等到運行時(run time),即程序運行的時候纔會根據語境來識別。所以這裏面就有兩個概念要分清:編譯時跟運行時。
(2)動態綁定
動態綁定(dynamic binding)貌似比較難記憶,但事實上很簡單,只需記住關鍵詞@selector/SEL即可。先來看看“函數”,對於其他一些靜態語言,比如 c++,一般在編譯的時候就已經將將要調用的函數的函數簽名都告訴編譯器了。靜態的,不能改變。而在OC中,其實是沒有函數的概念的,我們叫“消息機 制”,所謂的函數調用就是給對象發送一條消息。這時,動態綁定的特性就來了。OC可以先跳過編譯,到運行的時候才動態地添加函數調用,在運行時才決定要調 用什麼方法,需要傳什麼參數進去。這就是動態綁定,要實現他就必須用SEL變量綁定一個方法。最終形成的這個SEL變量就代表一個方法的引用。這裏要注意 一點:SEL並不是C裏面的函數指針,雖然很像,但真心不是函數指針。SEL變量只是一個整數,他是該方法的ID。以前的函數調用,是根據函數名,也就是 字符串去查找函數體。但現在,我們是根據一個ID整數來查找方法,整數的查找字自然要比字符串的查找快得多!所以,動態綁定的特定不僅方便,而且效率更 高。
(3)動態加載
就是根據需求動態地加載資源。我對動態加載比較陌生,所以就沒什麼可總結的啦。等以後慢慢完善

1517 班 面試題
1. 什麼是MVC , 你在工作中是怎麼運行它的?
    mvc (Model View Controller) 模型(model) —視圖(View) -  控制器(controller)
    M:是指數模型 , v :是指用戶界面, C則是控制器  ,使用MVC 設計模型,可以把M和V 的實現代碼的分離 ,從而使同一個程序可以使用不同的變現形式MVC是一個設計模式,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務。分層概念

爲什麼要使用 MVC
   首先,最重要的一點是多個視圖能共享一個模型
    MVC的優點
(一)、低耦合性
  視圖層和業務層分離,這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼,同樣,一個應用的業務流程或者業務規則的改變只需要改動MVC的模型層即可。因爲模型與控制器和視圖相分離,所以很容易改變應用程序的數據層和業務規則。
二)、高重用性和可適用性
  隨着技術的不斷進步,現在需要用越來越 多的方式來訪問應用程序。MVC模式允許你使用各種不同樣式的視圖來訪問同一個服務器端的代碼。它包括任何WEB(HTTP)瀏覽器或者無線瀏覽器 (wap),比如,用戶可以通過電腦也可通過手機來訂購某樣產品,雖然訂購的方式不一樣,但處理訂購產品的方式是一樣的。由於模型返回的數據沒有進行格式 化,所以同樣的構件能被不同的界面使用。例如,很多數據可能用HTML來表示,但是也有可能用WAP來表示,而這些表示所需要的命令是改變視圖層的實現方 式,而控制層和模型層無需做任何改變

三)、較低的生命週期成本
  MVC使開發和維護用戶接口的技術含量降低。
 
(四)、可維護性
  分離視圖層和業務邏輯層也使得應用更易於維護和修改。

(五)、有利於軟件工程化管理
  由於不同的層各司其職,每一層不同的應用具有某些相同的特徵,有利於通過工程化、工具化管理程序代碼。

2.進程和線程有什麼區別 ,他們存在什麼聯繫?
    進程是什麼?
程序並不能單獨運行,只有將程序裝載到內存中,系統爲它分配資源才能運行,而這種執行的程序就稱之爲進程。程序和進程的區別就在於:程序是指令的集合,它是進程運行的靜態描述文本;進程是程序的一次執行活動,屬於動態概念
    進程與線程的區別
    •    進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
    •    線程是進程的一個實體, 是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。
    •    一個線程可以創建和撤銷另一個線程,同一個進程中的多個線程之間可以並

3.淺複製和深複製的區別


 淺 復 制:在複製操作時,對於被複制的對象的每一層複製都是指針複製。
   深 復 制:在複製操作時,對於被複制的對象至少有一層複製是對象複製。
   完全複製:在複製操作時,對於被複制的對象的每一層複製都是對象複製。

        注:1、在複製操作時,對於對象有n層是對象複製,我們可稱作n級深複製,此處n應大於等於1。
             2、對於完全複製如何實現(目前通用的辦法是:迭代法和歸檔),這裏後續是否添加視情況而定,
                                暫時不做講解。
             3、指針複製俗稱指針拷貝,對象複製也俗稱內容拷貝。
             4、一般來講,
                              淺層複製:複製引用對象的指針。
                               深層複製:複製引用對象內容。
           這種定義在多層複制的時候,就顯得模糊。所以本文定義與它並不矛盾。
            反而是對它的進一步理解和說明。          

retain:始終是淺複製。引用計數每次加一。返回對象是否可變與被複制的對象保持一致。

copy:對於可變對象爲深複製,引用計數不改變;對於不可變對象是淺複製,
         引用計數每次加一。始終返回一個不可變對象。

mutableCopy:始終是深複製,引用計數不改變。始終返回一個可變對象。

不可變對象:值發生改變,其內存首地址隨之改變。
   可變對象:無論值是否改變,其內存首地址都不隨之改變。
   引用計數:爲了讓使用者清楚的知道,該對象有多少個擁有者(即有多少個指針指向同一內存地址)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章