iOS面試題 集錦(2)

今天就來接着昨天的寫啊!!

21 深拷貝和淺拷貝的區別
淺拷貝(copy)是隻能複製指向對象的指針,而不復制引用對象本身,通過對象的指針來訪問對象,只是賦值地址
深拷貝:複製引用對象本身—再創建一個對象,兩個對象獨立 相互不影響。

22 什麼是安全釋放
先將對象release 再置爲nil

23 RunLoop是什麼
事件循環,是線程裏面的一個組件.主線程的RunLoop是自動開啓的.分爲:計時源(timer source),事件源(輸入源):input source.防止CPU中斷(保證程序執行的線程不會被系統終止).

24 Runtime是什麼
runtime簡稱運行時,最主要的是消息發送機制
runtime是一套比較底層的純C語言API,屬於一個C語言庫,包含了很多底層的C語言API。
平時編碼OC代碼,在程序運行過程中,其實最終都是轉換成了runtime的C語言代碼,runtime算是OC的幕後工作者

25 什麼是序列化和反序列化,可以用來做什麼?如何在OC中實現複雜對象的存儲?
把對象轉換爲字節序列的過程稱爲對象的序列化
把字節序列恢復爲對象的過程稱爲對象的反序列化
將對象寫到文件或者數據庫裏面,並且可以讀出來
遵守NSCoding協議,來實現複雜對象的存儲
實現該協議後就可以對其進行打包或者解包,然後轉換爲NSData

26 寫一個標準宏MIN,這個宏輸入兩個參數並返回較小的一個

#define MIN((A),(B)) (A(A:B))

27 iphone os有沒有垃圾回收機制?簡單闡述一下OC內存管理
沒有垃圾回收機制
內存管理機制:使用引用計數管理,分爲ARC和MRC,MRC需要程序員自己管理內存,ARC則不需要.但是並不是所有對象在ARC環境下均不需要管理內存,子線程和循環引用並不是這樣.
與retain配對使用的是release,retain代表引用計數+1,release代表引用計數-1,當引用計數減爲0時,對象則被系統自動銷燬.與alloc配對使用的是dealloc,alloc代表爲對象開闢內存空間,dealloc則代表銷燬對象的內存空間.

28 簡述應用程序按Home鍵進入後臺時的生命週期,以及從後臺回到前臺時的生命週期
進入後臺時的方法

- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidEnterBackground:(UIApplication *)application

回到前臺的方法

 - (void)applicationWillEnterForeground:(UIApplication *)application
- (void)applicationWillResignActive:(UIApplication *)application

29 ViewController 的 alloc,loadView, viewDidLoad, viewWillAppear, viewDidUnload,dealloc、 init分別是在什麼時候調用的?在自定義ViewController的時候這幾個函數裏面應該做什麼工作?

alloc 申請內存時調用
loadView 加載視圖時調用
ViewDidLoad 視圖已經加載後調用
ViewWillAppear 視圖將要出現時調用
ViewDidUnload 視圖已經加載但沒有加載出來時調用
dealloc 銷燬該視圖時調用
init 視圖初始化時調用

30 描述應用程序的啓動順序。

a 程序入口main函數創建UIApplication實例和UIApplication代理實例 b 在UIApplication代理實例中重寫啓動方法,設置根ViewController c 在第一ViewController中添加控件,實現應用程序界面

31 爲什麼很多內置類如UITableViewControl的delegate屬性都是assign而不是retain?請舉例說明。

防止循環引用
比如 對象A引用了對象B,對象B引用了對象C,對象C引用了對象B,這時B的引用計數是2,而C的引用計數是1,當A不在使用B的時候,就釋放了B的所有權,這時C還在引用B,所以B不會釋放,引用計數爲1,而此時B也引用了C,B不釋放,C也不會釋放,所以他們的引用計數都是1,永遠都不會釋放,形成了循環引用。

32 寫一個便利構造器

@interface Person : NSObject
{
    int _age;
    NSString *_name;
}
- (Person *)initWithAge: (int)age andWithName: (NSString *)name; 
+ (Person *)initWithAge: (int)age andWithName: (NSString *)name;//這個類方法在返回Person對象時,就可以給_age和_name賦值,這個就是便利構造器
@end

@implementation Person
- (Person *)initWithAge: (int)age andWithName: (NSString *)name
{
    _age = age;
    _name = name;
}
+ (Person *)initWithAge: (int)age andWithName: (NSString *)name
{
    return [[Person alloc] initWithAge:age andWithName:name];
}
@end

33 NSThread, NSOperation, GCD 三種多線程的對比

NSThread :優點就是比其他兩個更加輕量級,使用簡單 。缺點就是需要自己管理生命週期,線程同步,加鎖,睡眠以及喚醒等。線程同步對數據的加鎖會有一定的系統開銷

NSOperstion:優點是不需要關心線程管理,數據同步的問題,可以把精力放在自己需要的操作上,而且是面向對象的。它是個抽象類,要使用必須使用它的子類:NSInvocationOperation,NSBlockOperation.

GCD : 是由蘋果開發的一個多核編程的解決方案,iOS4.0以上纔有,是代替NSThread和NSOperation的高效強大的技術

35 MVC模式結構
M:模型,是應用程序的主體部分。模型代表了業務數據和業務邏輯。當數據改變的時候,它需要負責通過控制器通知視圖,一個模型能爲多個視圖提供數據,所以提高了應用的可用性。

V:視圖,數據的展現,視圖是用戶看到並且與之交互的界面,視圖向用戶顯示相關數據,並且能接收用戶輸入的數據,但它並不能進行任何實際的業務處理

C:控制器,邏輯處理,控制實體數據在視圖上展示,調用模型處理業務請求。

36 簡述NotificationCenter、KVC、KVO、Delegate?並說明它們之間的區別?

NotificationCenter 消息中心,消息通知 發送一個通知可以讓多個類接收
KVC:利用鍵-值間接訪問類中的某個屬性
KVO:利用鍵-路徑間接訪問類中的某個屬性,也就是觀察者模式,基於KVC和通知中心,觀察的是實例變量。能實時監聽變化
Delegate:委託方,代理方,協議 實現一對一的傳值

37 ViewController的didReceiveMemoryWarning是在什麼時候被調用的?
1.當應用程序的內存使用接近系統的最大內存使用時,應用會向系統發送內存警告,這時候系統會調用方法向所有ViewController發送內存警告.
2.打開系統相機.
3.加載高清圖片.
默認操作:把裏面沒有用的對象進行釋放.

38 介紹響應者鏈.
當用戶點擊屏幕,能夠產生響應的對象組成的鏈.
繼承自NSResponder,響應者鏈能夠中斷.
有些需要打開用戶交互才能使用 比如 UILabel 和 UIImageView

39 OC中對象的交互是如何實現的?
消息機制(即調用方法)

40 什麼是沙盒?沙盒裏包含哪些文件,如何獲取文件路徑?
沙盒:程序可操作的磁盤空間,系統爲之開闢
裏面包含了三個文件夾(其中Libaray 包含兩個)
1 Documents 文本類型,基本數據 txt,text
2 Library/caches 緩存文件,圖片,視頻,音頻,存儲數據量大的
3 Library/Preference 用戶偏好設置,單例類 perferences路徑無法找到,只能通過NSUserDefaults.
4 tmp 暫存區 半成品,比如沒有下載好的視頻,音頻 下載好後系統會自動執行剪切操作,將tmp裏面的東西放到caches裏面

文件路徑獲取方法是
[NSSearchPathForDirectoriesInDomains(9, 1, 1) firstObject];
NSDocumentDirectory = 9 ; 用來查找Documents文件
NSCachesDirectory = 13;用來查找Cacher文件

今天就找到這了 還有找到就繼續發出來啊

發佈了23 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章