iOS開發之OC面試題總結
1.簡述OC中記憶體管理機制
OC的記憶體管理機制是自動引用技術,記憶體管理的原則是誰開闢誰釋放,分為ARC和MRC,MRC的話就是需要我們程式員手動管理記憶體,ARC不需要我們手動管理記憶體,系統會自行管理。
2.readwrite,readonly,assign,retain,copy,nonatomic、atomic、strong、weak屬性的作用?
readWrite讀寫特性,可讀可寫.
readonly唯讀,只有getter,沒有setter.
assign一般用於基礎資料型別 (Elementary Data Type)和ID類型.
copy拷貝,一般用於NSString.分為深拷貝和淺拷貝,深拷貝拷貝的是對象,淺拷貝拷貝的是指標.
nonatomic非原子性,不考慮安全執行緒,優點是效率高.
atomic原子性,優點是安全執行緒,缺點是效率低.
strong強引用,和MRC下的retain一樣.weak弱引用,類似MRC下的assign.但是要注意的是strong和weak都是修飾物件類型的屬性的,不能修飾基礎資料型別 (Elementary Data Type).ARC下仍然使用assign修飾基礎資料型別 (Elementary Data Type).
3.關於iOS多線程問題
仔細閱讀:http://www.cocoachina.com/ios/20150731/12819.html
4.提升UITableView效能的幾點建議
1.cell高度計算 (可以先根據內容高度數組,返回cell時直接用數組返回高度)
2.cells的重用
3.cell快速滑動的時候不載入圖片,停止滑動的時候載入圖片
4.避免阻塞主線程
5.緩衝下載的圖片
6.不要過多使用Xib(如果可以的話使用storyboard)
7.使用CoreGraphics
8.透明度
也可仔細閱讀:http://www.cocoachina.com/ios/20150729/12795.html
6. 線程同步和非同步區別?
同步:一個線程要等待上一個線程執行完之後才能執行,生活中的例子(上廁所)。
非同步:同時去做兩個或者多個線程。比如邊聽歌邊看報。
7.堆和棧的區別?
棧區(stack)--由編譯器自動分配釋放,存放函數的參數值、局部變數的值。先進後出
堆區(heap)--一般由程式員分配釋放。先進先出
全域區(靜態區)(static)--全域變數和靜態變數。程式結束後由系統釋放。
文字常量區--常量字串存放在這裡。程式結束後由系統釋放。
程式碼區—存放函數體的二進位檔案。
8.iOS類是否可以多繼承?
不可以,可以通過delegate和protocol和類目來實作類別似多繼承。
9.iOS本機資料儲存都有哪幾種方式?iOS如何?複雜物件的儲存?
1.Write寫入方式:永久儲存在磁碟中。只支援NSString、NSData、NSArray、NSDictionary。
2.NSKeyedArchiver(歸檔)採用歸檔的形式來儲存資料,該資料對象需要遵守NSCoding協議
3.SQLite(FMDB)注意FMDB不是資料庫,而是一個SQLITE管理架構.
4.CoreData切記coredata不是資料庫,他的儲存核心思想是託管對象。只是咱們經常用的隱藏檔為SQLite.還可以用XML,二進位等方式.
10.iOS的動態性
1.動態類型。如id類型。實際上靜態類型因為其固定性和可預知性而使用得更加廣泛。靜態類型是強型別,而動態類型屬於弱類型。運行時決定接收者。
2. 動態綁定。讓代碼在運行時判斷需要調用什麼方法,而不是在編譯時間。
3. 動態載入。讓程式在運行時添加代碼模組以及其他資。
11.深拷貝和淺拷貝的理解?
深拷貝拷貝的是內容,淺拷貝拷貝的是指標。如果子類對象的地址改變就是深拷貝反之淺拷貝。
12.什麼是安全釋放
在對象dealloc中release之後再把指標置為nil
13.怎樣實現一個singleton。
+(ZMYSingleton*)sharedInstance{
staticLOSingleton*sharedInstance=nil;
staticdispatch_once_tonceToken; //線程鎖
dispatch_once(&onceToken,^{
//最多調用一次
sharedInstance=[[ZMYSingletonalloc]init];
});
returnsharedInstance;
}
13.RunLoop是什嗎?
一個RunLoop就是一個事件處理的迴圈,用來不停的調度工作以及處理輸入時間。使用runloop的目的是讓你的線程在有工作的時候忙於工作,而沒工作的時候處於休眠狀態。主要是是為了減少 cpu無謂的空轉。每個線程都有Runloop,主線程的Runloop時預設開啟的,手動開闢的子線程Runloop是預設不開啟 的,如果需要開啟,需要調用API[[NSRunloopcurrentRunloop]run]開啟.
最常見的需要開啟Runloop的是在子線程裡面調用計時器(NSTimer),如果不開啟runloop迴圈方法就不能正常執行.
14.寫一個標準宏MIN,這個宏輸入兩個參數並返回較小的一個?
#definekMIN(X,Y)((X)>(Y))?(Y):(X)
15.簡述應用程式按Home鍵進入後台時的生命週期,以及從後台回到前台時的生命週期?
進入後台生命週期走:
-(void)applicationWillResignActive:(UIApplication*)application;
-(void)applicationDidEnterBackground:(UIApplication*)application;
回到前台生命週期走:
-(void)applicationWillEnterForeground:(UIApplication*)application;
-(void)applicationDidBecomActive:(UIApplication*)application;
16.ViewController的loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什麼時候調 用的?在自訂ViewController的時候這幾個函數裡面應該做什麼工作?
loadView:沒有正在使用nib視圖頁面,子類將會建立自己的自訂視圖層
viewDidLoad:試圖被載入後調用
viewWillAppear:試圖即將出現的時候調用
viewDidUnload:當系統記憶體吃緊的時調用,釋放掉當前未在window中顯示的試圖和對應的控制器
17.描述應用程式的啟動順序。
1、main函數建立UIApplication執行個體和UIApplication代理執行個體
2、在UIApplication代理執行個體中重寫啟動方法,設定第一ViewController
3、在第一ViewController中添加控制項,實現對應的程式介面。
18.為什麼寫代理的屬性都是assign而不是retain?請舉例說明。
防止循環參考,
Teacher*teacher=[[Teacheralloc]init];
Student*student=[[Studentalloc]init];t
eacher.delegate=student;
student.delegate=teacher;
在teacher中dealloc會release當前的Delegate,就會觸發student對象release,繼而也會導致student執行dealloc,在student中也會release自己的delegate,產生迴圈了。
19.UIImage初始化一張圖片有幾種方法?簡述各自的優缺點。
兩種:
1、從資源讀取,先在緩衝裡面查看圖片是否存在,沒有的話將圖片添加進緩衝再使用.有的話直接使用緩衝裡的.圖片用的次數比較多,使 用這種方式.缺點是效率低下.UIImage*image=[UIImageimageNamed:@”1.png”];
2.從手機本地讀取,直接加 載圖片.在圖片使用率低的圖片時使用. //讀取本地圖片非resourceNSString*aPath3=[NSStringstringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];[UIImageimageWithContentsOfFile:aPath3]
20.這段代碼有什麼問題嗎:
@implementationPerson
-(void)setAge:(int)newAge{
self.age=newAge;
}
@end
死迴圈
21.用OC寫一個冒泡排序
NSMutableArray *array = [NSMutableArrayarrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];
for (inti =0; i < array.count;i ++) {
for (intj =0; j < array.count-1 - i; j++) {
if([[arrayobjectAtIndex:j]integerValue] > [[arrayobjectAtIndex:j + 1]integerValue]) {
[arrayexchangeObjectAtIndex:jwithObjectAtIndex:j + 1];
}
}
}
NSLog(@"%@",array);
22.簡述你對UIView、UIWindow和CALayer的理解
UIView繼承於UIResponder,而UIResponder繼承於NSObject,可以響應使用者事件。UIView構建介面,用來顯示內容,側重於對內容的管理。
CALayer繼承於NSObject,不能響應事件。側重於對內容的繪製,以及對內容進行動畫處理,依賴於UIView來顯示。
UIWindow是特殊的UIView,通常一個app只有一個UIWindow,我們可以建立一個視圖控制器,並添加到 UIWindow上面,這樣的話這個視圖控制器就是app的第一響應者(First Responder).
23.frame和bounds區別:
frame:view在父視圖座標 中的位置
bounds:view在本地座標中的位置
center:view的中心點在父視圖中的位置
也可仔細閱讀:http://blog.csdn.net/mad1989/article/details/8711697
24.寫一個完整的代理
25.分析json、xml的區別?json、xml解析方式的底層是如何處理的?
XML是擴充通用標記語言(SGML),適合Web傳輸。提供統一的方法來描述和交換資料。
JSON(JavaScriptObjectNotation)一種輕量級的資料交換格式,具有良好的可讀和便於快速編寫的特性。可在不同平台之間進行資料交換。
26.ViewController的didReceiveMemoryWarning是在什麼時候被調用的?預設的操作是什麼?
在出現記憶體警告的時候調用,釋放掉暫時沒使用的可重用對象。這個方法不能手動調用!!!
27.物件導向的三大特徵,並作簡單的介紹
封裝、繼承、多態。
封裝:是把客觀事物封裝成抽象的類,隱藏內部的實現,對外部提供介面。
繼承:可以使用現有類的所有功能,並且在無需重新編寫原來的類的情況下對這些功能進行擴充。
多態:不同的對象以自己的方式響應相同的的訊息叫做多態。
28.簡單說一下懶載入
用到的時候初始化,不用的話不初始化只是一個指標,不佔用記憶體空間
29.分別描述類目(categories)和延展(extensions)是什嗎?以及兩者的區別?繼承和類目在實現中有何區別?為什麼Category只能為對象添加方法,卻不能新增成員變數?
category類目:在不知道源碼的情況下為一個類擴充方法,
extension:為一個類聲明私人方法和變數。
繼承是建立了一個新的類。
30.#import、#include和@class有什麼區別
#includeC語言中引入標頭檔,可能出現交叉編譯
#import在OC中引入自己建立的標頭檔
#import””是引入自己建立類的標頭檔
#import<>是引入系統類別的標頭檔
#import不會出現交叉編譯
@class對一個類進行聲明,告訴編譯器有這個類,但是類的定義什麼的都不知道.
31.談談你對MVC的理解?為什麼要用MVC?在Cocoa中MVC是怎麼實現的?你還熟悉其他的OC設計模式或別的設計模式嗎?
MVC是Model-VIew-Controller模型-視圖-控制器。 model資料模型,view是對這些資料的顯 示,viewcontroller就是把model拿到view中顯示,起到model和view之間橋樑的作用。MVC可以實現程式最大程 度的可重用性。MVC各元素分開也能便於代碼的更新、維護以及提高代碼的重用性.
單例模式,delegate設計模式,target-action設計模式
32.字串替換方法:
[stringstringByReplacingOccurrencesOfString:@"png"withString:@""]
33.對於語句NSString*testObject=[[NSDataalloc]init]; testObject在編譯時間和運行時分別是什麼類型的對象?
編譯的時候是NSString類型,啟動並執行時候是NSData類型
34.什麼是沙箱(sandbox)?沙箱包含哪些檔案,描述每個檔案的使用情境。如何擷取這些檔案的路徑?如何擷取應用程式套件組合中檔案的路徑?
iOS應用程式只能在為該程式建立的檔案系統中讀取文 件,不可以去其它地方訪問,此地區就是沙箱,用來儲存所有的非代碼檔案。(例像,表徵圖,聲音,映像,屬性列表,文字檔等。)
預設每個沙箱有3個檔案夾:Documents,Library和tmp。
Documents:儲存程式中建立的或在程式中瀏覽到的檔案資料
iTunes備份和恢複的時候會包括此目錄
Library/Caches:存放快取檔案,iTunes不會備份此目錄,目錄下檔案在應用退出時不刪除
tmp:提供一個即時建立臨時檔案的地方。
iTunes在與iPhone同步時,備份所有的Documents和Library檔案。
iPhone在重啟時,會丟棄所有的tmp檔案。
35.isKindOfClass、isMemberOfClass作用分別是什嗎?
-(BOOL)isKindOfClass:classObj判斷是否是這個類或者是這個類子類的執行個體
-(BOOL)isMemberOfClass:classObj判斷是否是這個類的執行個體
36.iOS中UIViewController的生命週期及iOS程式執行順序:
視圖控制對象生命週期
init-初始化程式
viewDidLoad-載入視圖
viewWillAppear-UIViewController對象的視圖即將加入視窗時調用;
viewDidApper-UIViewController對象的視圖已經加入到視窗時調用;
viewWillDisappear-UIViewController對象的視圖即將消失、被覆蓋或是隱藏時調用;
viewDidDisappear-UIViewController對象的視圖已經消失、被覆蓋或是隱藏時調用;
viewVillUnload-當記憶體過低時,需要釋放一些不需要使用的視圖時,即將釋放時調用;
viewDidUnload-當記憶體過低,釋放一些不需要的視圖時調用。
具體可參考:http://blog.csdn.net/huifeidexin_1/article/details/7566226
37. 簡述多線程。
答:Grand Central Dispatch簡稱GCD 解決多核並行運算的一種方案,主要有兩種隊列:並行、串列。
NSOperationQueue以隊列的形式實現了多線程,基於GCD的封裝。
NSThread 輕量級多線程,不常用 缺點:需要自己管理線程的生命週期,線程同步。線程同步對資料的加鎖會有一定的系統開銷
39. 該問題涉及編譯器的“記憶體對齊”問題:
例如:
對於結構體來說,按成員中所佔位元組最大的是float類型,佔用4個位元組,一共有3個成員,所以總的佔用位元組為:4*3=12.可通過編譯器命令來設定: #progmapack(2)
40. TCP/IP 建立串連的過程:
在TCP/IP協議中,TCP協議提供可靠的串連服務,採用三向交握建立串連;
第一次握手:建立串連時,用戶端發送串連請求到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到用戶端串連請求,向用戶端發送允許串連應答,此時伺服器進入SYN_RECV狀態;
第三向交握:用戶端收到伺服器的允許串連應答,向伺服器發送確認,用戶端和伺服器進入通訊狀態,完成三向交握。
(所謂的三向交握,就是要有三次串連資訊的發送、接收過程。TCP串連的建立需要進行三次串連資訊的發送、接收。)
41.什麼是UDP和TCP的區別是什嗎?
TCP 的全稱是傳輸控制通訊協定,這種協議可以提供連線導向的、可靠的、點到點的通訊。
UDP 的全稱是使用者資料包協議。他可以提供非串連的不可靠的點到多點的通訊,是osi參考模型中一種不需連線的傳輸層協議,提供面向事務的簡單的不可靠資訊傳輸,_IETFRFC 768 是UDP 的正式規範;
選擇何種協議,看程式注重那個方面,可靠抑或快速。
42.static關鍵字的作用
靜態全域變數
優點:
1、節省記憶體。靜態變數只儲存一處,但供所有對象使用。
2、它的值是可以更新的。
3、可提高時間效率。只要某個對象對靜態變數更新一次,所有的對象都能訪問更新後的值。
43.iOS系統架構分為幾層,分別是什麼
1、Core OS是核心作業系統層,包括記憶體管理、檔案系統、電源管理以及一些其他的作業系統任務。
2、Core Services是核心服務層,用來訪問iOS的一些服務。
3、Media是媒體層,通過它我們可以在應用程式中使用各種媒體檔案,進行音頻與視頻的錄製,圖形的繪製,以及製作基礎的動畫效果。
4、Cocoa Touch是可觸摸層,本質上來說它負責使用者在iOS裝置上的觸摸互動操作。