你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發之OC面試題總結

iOS開發之OC面試題總結

編輯:IOS開發綜合

1.簡述OC中內存管理機制

OC的內存管理機制是自動引用技術,內存管理的原則是誰開辟誰釋放,分為ARC和MRC,MRC的話就是需要我們程序員手動管理內存,ARC不需要我們手動管理內存,系統會自行管理。

2.readwrite,readonly,assign,retain,copy,nonatomic、atomic、strong、weak屬性的作用?

readWrite讀寫特性,可讀可寫.

readonly只讀,只有getter,沒有setter.

assign一般用於基本數據類型和ID類型.

copy拷貝,一般用於NSString.分為深拷貝和淺拷貝,深拷貝拷貝的是對象,淺拷貝拷貝的是指針.

nonatomic非原子性,不考慮線程安全,優點是效率高.

atomic原子性,優點是線程安全,缺點是效率低.

strong強引用,和MRC下的retain一樣.weak弱引用,類似MRC下的assign.但是要注意的是strong和weak都是修飾對象類型的屬性的,不能修飾基本數據類型.ARC下仍然使用assign修飾基本數據類型.

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([[array objectAtIndex:j]integerValue] > [[array objectAtIndex:j + 1]integerValue]) {

[arrayexchangeObjectAtIndex:j withObjectAtIndex: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設備上的觸摸交互操作。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved