1.請簡述NSSet、NSArray 、NSDictionary的區別
NSSet、NSArray、NSDictionary 都是屬於不可變集合類, 在集合類裏只能添加對象元素不能添加基本數據類型。
不可變:在建立完集合類後就不可以對他們進行修改。
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];
16.@property 做用
@property 讓編譯器自動生成與類成員變量相同名的 getter setter 方法 建立的成員變量是以_開頭 它建立的默認修飾域是private
還能進行對 對象內存管理
17.@property
當中的retain 與assign有什麼做用
retain: 只能給對象類型使用,當調用set方法的時候會將對象的引用計數器+1
assign: 直接賦值,通常給基本數據類型使用, 不會增長引用計數 , 設置代理的時候須要使用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 =@「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 else 28 { 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.給其添加手勢數據庫