1. 簡述OC中內存管理機制。與retain配對使用的方法是dealloc還是release,爲什麼?需要與alloc配對使用的方法是dealloc還是release,爲什麼?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak屬性的作用?
引用計數機制進行內存管理。
retain對應的是release,內存的釋放用release。
alloc對應的是dealloc,內存的銷燬用dealloc。
readwrite此標記說明屬性會被當成讀寫的,這也是默認屬性。
readonly此標記說明屬性只可以讀,也就是不能設置,可以獲取。
assign不會使引用計數加1,也就是直接賦值。
retain會使引用計數加1。
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類是否可以多繼承?如果沒有,那可以用其他方法實現嗎?簡述實現過程。
沒有 用catogory、extension來實現
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.coredata
11. iOS動態類型和動態綁定、動態載入
IOS的動態類型(強類型)id
可以在代碼運行時判斷對象的類型。使用id類型(又稱強類型)可以在運行的時候使用任何數據類型來替換。動態類型讓程序更加靈活,但會使數據的統一性降低。我們常用的靜態類型如NSString等是有着自己的優勢的,使用靜態類型編譯器可以完全分析代碼的性能,可預知性更高。
IOS動態綁定
可以在代碼運行的時候判斷需要調用什麼方法。動態類型和動態綁定使得選擇那個接收者以及調用哪個方法都可以在運行時決定。
動態載入
應用可以根據需要加載可執行代碼以及資源,而不是在啓動時就加載所有資源。