iOS面試題一

1. 簡述OC中內存管理機制。與retain配對使用的方法是dealloc仍是release,爲何?須要與alloc配對使用的方法是dealloc仍是release,爲何?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak屬性的做用?ios


引用計數機制進行內存管理。程序員

retain對應的是release,內存的釋放用release安全

alloc對應的是dealloc,內存的銷燬用dealloc數據結構

readwrite此標記說明屬性會被當成讀寫的,這也是默認屬性。多線程

readonly此標記說明屬性只能夠讀,也就是不能設置,能夠獲取。併發

assign不會使引用計數加1,也就是直接賦值。異步

retain會使引用計數加1ide

copy創建一個索引計數爲1的對象,在賦值時使用傳入值的一份拷貝。函數

nonatomic:非原子性訪問,多線程併發訪問會提升性能。性能

atomic:原子性訪問。

strong:打開ARC時纔會使用,至關於retain

copy : 適用於接受了nscopy協議的對象類型

assign : 適用於通常類型

retain : 適用於通常對象類型


2.類變量的@protected ,@private,@public,@package,聲明各有什麼含義?


@protected 該類和全部子類中的方法能夠直接訪問這樣的變量。

@private 該類中的方法能夠訪問,子類不能夠訪問。

@public   能夠被全部的類訪問

@package 本包內使用,跨包不能夠


3.線程是什麼?進程是什麼?兩者有什麼區別和聯繫?


線程,有時稱爲輕量級進程,是被系統獨立調度和CPU的基本運行單位。 

 進程是操做系統中能夠並行工做的基本單位。 

 一個應用程序裏至少有一個進程,一個進程裏至少有一個線程


4.談談你對多線程開發的理解?ios中有幾種實現多線程的方法

 

在一個進程中有多個線程,每一個線程有本身單獨的任務 優勢效率快缺點不安全,耗費資源 

 有三種: 第一種,使用@synchronized(self)  第二種,使用GCD  第三種,使用NSOperationQueue


5.線程同步和異步的區別?IOS中如何實現多線程的同步?

一個進程啓動的多個不相干線程,它們相互之間關係爲異步。

 同步的話指的是多線程同時操做一個數據這個時候須要對數據添加保護這個保護就是線程的同步。

 用GCD中的串行隊列來解釋多線程的同步,也就是隊列中的任務爲串行,它們各自對相鄰的任務有依賴性,若是任務1不完成,那麼任務2就不會開始,這就是同步


6.假設有一個字符串aabcad,請寫一段程序,去掉字符串中不相鄰的重複字符串,即上述字符串處理以後的輸出結果爲:aabcd

NSMutableString *str = [[NSMutableString alloc]initWithFormat:@"aabcad"];
for (int i = 0; i < str.length - 1; i++) {
    unsigned char a = [str characterAtIndex:i];
    for (int j = i + 1; j < str.length; j++) {
        unsigned char b = [str characterAtIndex:j];
        if (a == b) {
            if (j == i + 1) {
                        
            }else{
                        
                [str deleteCharactersInRange:NSMakeRange(j, 1)];
            }
        }
    }
}
      
NSLog(@"%@", str);

7.獲取一臺設備惟一標示的方法有哪些?


1.UDID

2.UUID

3.MAC ADDRESS

4.OPEN UDID

5.廣告標識符

6.Vindor標示符

ios7以後用的時keychain(鑰匙串)


8.ios類是否能夠多繼承?若是沒有,那能夠用其餘方法實現嗎?簡述實現過程。


沒有    catogoryextension來實現

Category也叫分類或類,主要做是爲 沒有源代碼的類添加 。經過Category添加的法會成爲原類的部分。從達到擴展個類的功能。

Extension (延展)的主要做是管理類的私有 


9.堆和棧的區別?


堆須要用戶手動釋放內存,而棧則是編譯器自動釋放內存

堆棧的區別:  

(1)管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生 memory leak 

(2)申請大小:能從棧得到的空間較小,堆是向高地址擴展的數據結構,是不連續的內存區域。堆的大小受限於計算機系統中 有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。

(3)碎片問題:對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。 對於棧來說,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存塊 從棧中間彈出 

(4)分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成 ,好比局部變量的分配。動態分配由 alloca函數進行分配,可是棧的動態分配和堆是不一樣的,他的動態分配是由編譯器 進行釋放,無需咱們手工實現。

(5)分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧 都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。


10.ios本地數據存儲都有哪幾種方式?    1.  NSKeyedArchiver(歸解檔)    2.  NSUserDefaults    3.  Write寫入方式    4.  SQLite3    5.coredata11. iOS動態類型和動態綁定、動態載入   IOS的動態類型(強類型)id 能夠在代碼運行時判斷對象的類型。使用id類型(又稱強類型)能夠在運行的時候使用任何數據類型來替換。動態類型讓程序更加靈活,但會使數據的統一性下降。咱們經常使用的靜態類型如NSString等是有着本身的優點的,使用靜態類型編譯器能夠徹底分析代碼的性能,可預知性更高。 IOS動態綁定 能夠在代碼運行的時候判斷須要調用什麼方法。動態類型和動態綁定使得選擇那個接收者以及調用哪一個方法均可以在運行時決定。 動態載入 應用能夠根據須要加載可執行代碼以及資源,而不是在啓動時就加載全部資源。    
相關文章
相關標籤/搜索