標籤:style blog http color io os ar 使用 for
1.請簡述NSSet、NSArray 、NSDictionary的區別
NSSet、NSArray、NSDictionary 都是屬於不可變集合類, 在集合類裡只能添加對象元素不能添加基礎資料型別 (Elementary Data Type)。
不可變:在建立完集合類後就不能夠對他們進行修改。
NSSet :
1.是一個無序的集合
2.在記憶體中儲存的地址是不連續的
3.並且添加進去的元素是不可重複的
4. NSSet它是使用hash演算法方式 直接找到元素的位置。
NSArray
1.是一個有序的集合
2.在記憶體中儲存的地址是連續的,添加的元素是可重複的
3. NSArray能夠支援通過下標訪問元素。
4. 如果想知道一個元素是否存在這個數組當中的話,那麼需要遍曆整個數組一個個去判斷,這樣顯然效率地下。
NSDictionary
1.這一個無序的集合
2.它的資料存放區方式是key value 索引值對的方式進行儲存的
3.key 在整個NSDictionary 裡是唯一的,如果key發生重複,那麼後添加的元素會覆蓋之前的。
4.同NSSet一樣也是使用hash 直接找到元素的位置,效率快。
2.請簡述static關鍵字有什麼作用。
當使用static修飾變數的時候,稱這個變數為靜態變數,所謂的靜態變數也就其在記憶體當中只有一份, 當程式結束的時候才會銷毀這塊記憶體。
static 只能在implement外或者是方法中聲明,如果不給它 賦予初值 預設值為0 ,程式啟動後會給它進行一次初始化操作。
被static修飾過的變數 不能通過類名.的方式進行訪問, 如果想訪問一個類裡的static變數並對它進行一些修改, 需要提供一個方法。
3. 請說明什麼時候用代理,什麼時候用通知
代理 :是一對一的關係 , 1個對象只能告訴另外一個對象發生了什麼事。
通知 : 多對多的關係,1個對象能夠告訴多個對象發生了什麼事,1個對象能夠接收多個對象發生了什麼。
4. 請說明分類與類擴充有什麼區別。
分類:能夠在不熟悉原有類的情況下給這個類添加方法。如果新添加的方法與原有類的方法相同,那麼系統會優先使用分類的方法。
類擴充:類擴充可以在原有類的基礎上給這個類添加 屬性和方法,其添加的方法必須要實現。
5.請說明什麼是懶載入,懶載入有什麼用?
懶載入也稱為消極式載入。 即用到的時候再載入。
懶載入的作用:一般用於頁面很長,頁面但中圖片很多的情況下,如果想把這些資料一次性載入完成,那是不可能的,而且這樣效能也不好。 為了避免這種請況發生,目前主流的做法是頁面初次載入時,只顯示當前可視地區的圖片,當使用者滾動頁面的時候,當圖片進入可視地區時再載入,這樣可以明顯的提高頁面載入速度,而更少的圖片並發請求數,也可以大大的減輕伺服器的壓力,可謂一舉多得。
圖片消極式載入的原理比較簡單,先把圖片的真真實位址寫在自訂的一個屬性上,比如 data-url(HTML5中以 data- 開頭的自訂屬性都是合法的),src 地址最好不要空著,放一個 1×1 的全透明佔位圖片就行了,如
當頁面滾動的時候開始計算圖片是否處在當前視窗的可視地區,如果在的話,就把 src 的假地址替換成 data-url 的真真實位址。
6.請說明 #include 、#import @class 各自的作用
#include : 是C語言的先行編譯指令 告訴編譯器匯入相關的標頭檔 ,在OC 當中也能使用 因為OC 相容C文法
#import : 是GCC編譯器提供 不管在一個檔案中出現多少次,可保證標頭檔只被包含一次
@class : 告訴編譯器當前這個檔案中 聲明了這個類,但是類裡面具體定義什麼不知道,使用它能減少編譯時間
7.#import <> 與#import “” 有什麼區別
#import <> 匯入系統的標頭檔
#import " " 匯入使用者自訂檔案
8.id類型是什麼,instancetype是什麼,有什麼區別
id類型:萬能指標,能作為參數,方法的傳回型別。
instancetype: 只能作為方法的範圍類型,並且返回的類型是當前定義類的類類型。
9.請寫出ARC與MRC中英文全稱
ARC : Automatic Reference Counting 自定引用計數
MRC : Mannul Reference Counting 手動引用計數
10.請說明什麼是block,block能用來幹什麼,__block有什麼用。
Block對象是 C 層級的文法和運行時特性 它們和標準 C 函數很類似,但是除了可執行代碼外,它們還可能包含了變數自動綁定(棧)或記憶體託管(堆)。所以一個block維護一個狀態集(資料),它們可以在執行的時候用來影響程式行為。
你可以用blocks來編寫函數運算式,這些運算式可以作為 API 使用,或可選的儲存,或被多個線程使用。Blocks作為回調特別有用,因為block攜帶了進行回調所需要的執行代碼和執行過程中需要的資料。
__block作用:預設block 塊內出變數是不能進行修改 _也就是唯讀狀態,使用__block修飾變數就能夠改變block塊內中的變數的值。
11.什麼是物件導向,物件導向的特性是什嗎?
把現實世界當中的所有事物關係都抽象成在電腦裡可表示的一個關係。那麼這個具體的事物就是這個對象。
物件導向的特性: 繼承 封裝 多態
12.什麼是多態?
同一個操作,作用於不同的對象,產生不同的結果。
實現多態要具備以下條件
1.要有繼承
2.要有重寫
3.父類的指標指向了子類的對象。
13. 請簡述什麼是MVC
MVC : Model View Controller (模型、視圖、控制器)
Model :負責處理資料邏輯,模型對象負責在資料庫當中儲存。
View : 負責顯示資料,顯示的資料是依據模型來進行顯示
Controller:負責處理使用者互動,負責從視圖讀取資料,控制使用者輸入,並向模型發送資料。
特點:
降低模組之間的耦合度
MVC不屬於設計模式,它是一種架構、體繫結構的設計。
架構設計:一個架構模式描述軟體系統裡的基本結構和組織綱要。架構模式提供一些事先定義好的子系統,指定它們的責任,並給出把它們組織在一起的法則和指南。有人將架構模式稱為系統模式。一個架構模式通常可以分解成很多個設計模式的聯合使用。
設計模式:一個設計模式提供一種提煉子系統或軟體系統中的組件或者它們之間關係的設計。設計模式描述普遍存在的在相互連信的組件中重複出現的結構,這種結構解決在一定的背景中的具有一般性的設計問題。
14.請寫出你所知道的資料傳遞方式
1.代理
2.通知
3.直接存取對象的set方法進行資料傳遞
4.block
15.點文法的本質是什嗎?寫一個點文法的例子。
點文法的本質是調用了getter setter 方法。
例: person.age = 10;// 這裡調用了 [person setAge:10]
int age = person.age; // 這裡調用 [person age];
[email protected] 作用
@property 讓編譯器自動產生與類成員變數相同名的 getter setter 方法 建立的成員變數是以_開頭 它建立的預設修飾域是private
還能進行對 對象記憶體管理
[email protected]
當中的retain 與assign有什麼作用
retain: 只能給物件類型使用,當調用set方法的時候會將對象的引用計數器+1
assign: 直接賦值,一般給基礎資料型別 (Elementary Data Type)使用, 不會增加引用計數 , 設定代理的時候需要使用assign ,assign主要是為瞭解決循環參考計數而設計的。
18.什麼是構造方法,構造方法有什麼用,使用構造方法有什麼注意點。
什麼是構造方法:構造方法是對象初始化並返回對象一個執行個體的一個方法。
構造方法有什麼用: 一般在構造方法裡 對類進行一些初始化操作
注意點:方法開頭必須以init開頭,接下來名稱要大寫 例如 initWithName ,initLayout
19.請簡述什麼是協議,協議能用來做什麼
協議:一個公用的介面。
在協議裡只能定義方法不能定義屬性,協議的實現需要具體的類去遵循這個協議實現協議裡的方法。在協議裡定義的方法可以是可選實現和必須實現的,預設是可選的。
20.記憶體管理的原則是什麼。
只要出現new,alloc,copy,mutableCopy,copyWithZone,retain,就要配對release操作,或者autorelease操作
21.請說明frame和bounds的區別
frame : 以父控制項左上方為原點,顯示當前控制項所在的位置和尺寸大小
bounds :以控制項本身左上方為原點,顯示當前的尺寸 bounds改變會改變控制項的frame
22.請說明xib和storyboard對比有什麼區別
都是用來描述軟體介面
xib是輕量級,用來描述局部UI介面
StroyBoard是重量級,用來描述整個軟體的多個介面,並且能展示多個介面之間的跳轉關係
23.一般重寫loadView是用來幹什麼
用來進行自訂控制器的視圖
24.請寫出視圖控制器的生命週期方法
loadView
viewDidLoad
viewWillAppear
viewDisAppear
viewWillDisAppear
viewDidDisAppear
didReceiveMemoryWaring
viewWillUnLoad
viewDidUnLoad
25.請寫出以下預設尺寸大小
iPhone3.5英寸 非 retina 320 * 480
iPhone3.5 retina 640 * 960
iPhone 4英寸 320 * 568
UIStatusBar 320 * 20
UINavigationBar 320 * 44
UITableViewCell 320 * 44
UITabBar 320 * 49
26.UIImage載入圖片通過
+ (UIImage *)imageNamed:(NSString*)name;
+ (UIImage *)imageWithContentsOfFile:(NSString *)path
這兩個方法載入圖片有什麼不同。
1.上面這種方式載入圖片只需要傳入圖片的名字不需要傳入具體的路徑 載入完後會有緩衝。
2.下面載入圖片需要傳入圖片的全路徑 直接載入
一般使用小圖片的時候可以選擇使用上面的方式,大圖片使用下面的方式。
27.drawRect:?法在什麼時候被調用?
當視圖第一次被顯示到window上的時候會調用此方法
手動調用setNeedsDisplay 或者 setNeedsDisplayInRect
28.請說明UIView與CALayer的關係?
UIView能夠接收事件的處理和視圖的展示 而CALayer只是視圖的繪製 ,因此一個視圖他不需要與使用者進行互動應使用CALayer效能會高一些, 這樣更加輕量級。
29.如何利用Quartz2D 繪製東西到視圖上
1.擷取圖形上下文
2.繪製路徑
3.儲存路徑
4.渲染到具體的視圖上。
30.一個UIViewController是否可以關聯兩個不同資料來源來顯示兩個tableView?
可以。
第一種方式
1.配置資料來源的時候,要對配置的tableView做類型判斷
1 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 2 { 3 if(tableView ==self.tableView1) 4 { 5 return 5; 6 } 7 else 8 { 9 return 10; 10 } 11 }12 13 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 14 staticNSString *ID1 [email protected]“cellStyleOne"; 15 staticNSString *ID2 =@"cellStyleTwo";16 UITableViewCell *cell =nil; 17 if(tableView ==self.table1) 18 { 19 cell = [tableView dequeueReusableCellWithIdentifier:ID1]; 20 if(cell ==nil)21 { 22 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID1]; 23 } 24 [cell.textLabel setText:@"itcast"]; 25 [cell.detailTextLabel setText:@"detail"]; 26 } 27 else28 { 29 cell = [tableView dequeueReusableCellWithIdentifier:ID2]; 30 if(cell ==nil) 31 { 32 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID2]; 33 } 34 [cell.textLabel setText:@“kolnick"]; 35 } 36 return cell; 37 }
第二種方式:
建立的一個視圖控制器 讓其遵循資料來源協議,並實現相關方法
然後在第一個視圖控制器裡建立並把他的視圖加入到第一個視圖控制器當中。
31.UIImageView可以直接點擊響應操作?如果不可以,怎麼才可以?如何監聽UIImageView的觸摸事件?
不可以
開啟userInteractionEnable =YES;
因為UIImageView也是繼承自UIView 凡是繼承自UIView都可以接收使用者的觸摸事件
方法1.重寫touchesBegin方法
方法2.給其添加手勢
iOS面試題收集