iOS基礎面試題彙總

跳轉:iOS面試題總結html

[TOC]java


1. #import 跟#include、@class有什麼區別?#import<> 跟 #import""又什麼區別?

  • 均可以完整包含某個文件的內容,可是#import能防止一個文件被包含屢次
  • @class僅僅是聲明一個類名,並不會包含類的完整聲明;@class還能解決循環包含的問題
  • #import<> 用來包含系統自帶的文件,#import""用來包含自定義的文件

2. 屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼做用,在那種狀況下用?

  • readwrite:同時生成get方法和set方法的聲明和實現
  • readonly:只生成get方法的聲明和實現
  • assign:set方法的實現是直接賦值,用於基本數據類型
  • retain:set方法的實現是release舊值,retain新值,用於OC對象類型
  • copy:set方法的實現是release舊值,copy新值,用於NSString、block等類型
  • nonatomic:非原子性,set方法的實現不加鎖(比atomic性能高)

3. 寫一個setter方法用於完成@property(nonatomic,retain)NSString *name,寫一個setter方法用於完成@property(nonatomic,copy)NSString *name.

- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name retain];
}
}
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name copy];
}
}

4. 對於語句NSString*obj = [[NSData alloc] init]; ,編譯時和運行時obj分別是什麼類型?

  • 編譯時是NSString類型ios

  • 運行時是NSData類型面試

5. 常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?

  • 經常使用OC類型:NSString、NSArray、NSDictionary、NSData、NSNumber等
  • OC對象須要手動管理內存,C的基本數據類型不須要管理內存

6. id 聲明的變量有什麼特性?

  • id聲明的變量能指向任何OC對象

7. Objective-C如何對內存管理的,說說你的見解和解決方法?

  • 每一個對象都有一個引用計數器,每一個新對象的計數器是1,當對象的計數器減爲0時,就會被銷燬objective-c

  • 經過retain可讓對象的計數器+一、release可讓對象的計數器-1數據庫

  • 還能夠經過autorelease pool管理內存數組

  • 若是用ARC,編譯器會自動生成管理內存的代碼xcode

8. 內存管理的幾條原則時什麼?按照默認法則,哪些方法生成的對象須要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?

  • 只要調用了alloc、copy、new方法產生了一個新對象,都必須在最後調用一次release或者autorelease緩存

  • 只要調用了retain,都必須在最後調用一次release或者autorelease網絡

  • @property若是用了copy或者retian,就須要對再也不使用的屬性作一次release操做

  • 若是用了ARC,另外討論

9. 看下面的程序,三次NSLog會輸出什麼?爲何?

NSMutableArray *ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"];  // 1
[str retain];   // 2
[ary addObject:str]; // 3
NSLog(@"%zd", [str retainCount]);
[str retain];  // 4
[str release];   // 3
[str release];   // 2
NSLog(@"%zd", [str retainCount]);
[ary removeAllObjects]; // 1
NSLog(@"%zd", [str retainCount]);
// 結果:三、二、1 注意:retainCount方法並不可靠,可能返回-1

10. OC中建立線程的方法是什麼?若是指定在主線程中執行代碼?如何延時執行代碼?

  • 建立線程的方法
  • NSThread
  • NSOperationQueue和NSOperation
  • GCD
  • 主線程中執行代碼
  • [self performSelectorOnMainThread: withObject: waitUntilDone:];
  • [self performSelector: onThread:[NSThread mainThread] withObject: waitUntilDone:];
  • dispatch_async(dispatch_get_main_queue(), ^);
  • 延時執行
  • dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^);
  • [self performSelector: withObject: afterDelay:];
  • [NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:];

11. Difference between shallow copy and deep copy?

  • 淺拷貝:指針(地址)拷貝,不會產生新對象(淺拷貝,指針拷貝,shallow copy)

  • 源對象和副本對象是同一個對象

  • 源對象(副本對象)引用計數器+1,至關於作一次retain操做

  • 本質是:沒有產生新的對象

NSString *sourceString = @"Just test";
NSString *copyString = [sourceString copy];
NSLog(@"sourceString = %p, copyString = %p", sourceString, copyString);
// sourceString = 0x100001030, copyString = 0x100001030
  • 深拷貝:內容拷貝,會產生新對象(深拷貝,內容拷貝,deep copy)

  • 源對象和副本對象是不一樣的兩個對象

  • 源對象引用計數器不變,副本對象計數器爲1(由於是新產生的)

  • 本質是:產生了新的對象

// 源對象不可變 副本可變
NSString *sourceString = @"Just test";
NSMutableString *copyString = [sourceString mutableCopy];
NSLog(@"sourceString = %p, copyString = %p", sourceString, copyString);
// sourceString = 0x100001030, copyString = 0x10070f470 地址不同

// 源對象可變 副本不可變
NSMutableString *sourceString = [NSMutableString stringWithFormat:@"Just test"];
NSString *copyString = [sourceString copy];
NSLog(@"sourceString = %p, copyString = %p", sourceString, copyString);
// sourceString = 0x100570760, copyString = 0x8d814c14f8d9da09 地址不同

// 源對象不可變 副本不可變
NSMutableString *sourceString = [NSMutableString stringWithFormat:@"Just test"];
NSMutableString *copyString = [sourceString mutableCopy];
NSLog(@"sourceString = %p, copyString = %p", sourceString, copyString);
// sourceString = 0x100634aa0, copyString = 0x100603da0 地址不同
  • 只有源對象和副本對象都不可變時,纔是 shallow copy ,其它都是 deep copy

補充

  • 如何使用copy功能
    • 一個對象能夠調用copy或mutableCopy方法來建立一個副本對象
    • copy : 建立的是不可變副本(如NSString、NSArray、NSDictionary)
    • mutableCopy :建立的是可變副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
  • 使用copy功能的前提
    • copy : 須要遵照NSCopying協議,實現copyWithZone:方法
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
  • 使用mutableCopy的前提
    • 須要遵照NSMutableCopying協議,實現mutableCopyWithZone:方法
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end

12. What is advantage of categories? What is difference between implementing a category and inheritance?

  • 分類能夠在不修改原來類模型的基礎上拓充方法
  • 分類只能擴充方法、不能擴充成員變量;繼承能夠擴充方法和成員變量
  • 繼承會產生新的類

13. Difference between categories and extensions?


  • 分類是有名稱的,類擴展沒有名稱
  • 分類只能擴充方法、不能擴充成員變量;類擴展能夠擴充方法和成員變量
  • 類擴展通常就寫在.m文件中,用來擴充私有的方法和成員變量(屬性)

14. Difference between protocol in Objective-C and interfaces in Java?


  • Java的接口中聲明的方法必須都實現
  • Objective-C 的protocol中聲明的方法並不必定要實現

15. What are KVO and KVC?

  • KVC是鍵值編碼,能夠經過一個字符串的key(屬性名)修改對象的屬性值
  • KVO是鍵值監聽,能夠監聽一個對象屬性值的改變

16. What is purpose of delegates?


  • 兩個對象之間傳遞數據和消息
  • 解耦,拆分業務邏輯

17. What are mutable and immutable types in Objective C?


  • mutable是可變類型,好比NSMutableArray,能夠動態往裏面添加元素
  • immutable是不可變類型,好比NSArray,固定的存儲空間,不能添加元素

18. When we call Objective-C is runtime language what does it mean?


  • 動態綁定:對象類型在運行時才真正肯定
  • 多態性
  • 消息機制

19. What is difference between NSNotification and Protocol?


  • 經過NSNotification能夠給多個對象傳遞數據和消息
  • 經過protocol(代理模式)只能給一個對象傳遞數據和消息

20. What is push notification?


  • 本地推送:程序內部彈出通知到用戶設備
  • 遠程推送:由APNS推送通知到用戶設備

21. What is Polymorphism?


  • 多態:父類指針指向子類對象

22. What is Singleton?


  • 單例:保證程序運行過程當中,永遠只有一個對象實例

  • 目的是:全局共享一份資源、節省沒必要要的內存開銷

23. What is Responder Chain?



 響應者鏈:

  • UIResponder有一個Next responder屬性,經過該屬性能夠組成一個響應者鏈,事件或消息在其路徑上進行傳遞

  • 若是UIResponder沒有處理傳給它的事件,會將未處理的消息轉發給本身的Next responder

  • Using Responders and the Responder Chain to Handle Events

  • If the text field does not handle an event, UIKit sends the event to the text field’s parent UIViewobject, followed by the root view of the window. From the root view, the responder chain diverts to the owning view controller before directing the event to the window. If the window cannot handle the event, UIKit delivers the event to the UIApplication object, and possibly to the app delegate if that object is an instance of UIResponder and not already part of the responder chain.

24. Difference between frame and bounds?


  • frame以父控件的左上角爲座標原點
  • bounds以控件自己的左上角爲座標原點

25. Difference between method and selector?


  • 經過一個selector能夠找到方法地址,進而調用一個方法

26. Is there any garbage collection mechanism in Objective-C?

  • Objective-C1.0沒有垃圾回收
  • Objective-C有垃圾回收,只能用在Mac上
  • iOS中有ARC機制,是編譯器特性,垃圾回收是運行時特性

27. What is NSOperation queue?


  • 用來存放NSOperation對象的隊列,能夠用來異步執行一些操做
  • 通常能夠用在網絡請求等耗時操做

28. What is lazy loading?


  • 延遲加載:好比控制器的view,在第一次用到view時纔會調用loadView方法進行建立

29. Can we use two tableview controllers on one viewcontroller?

  • 從技術角度上分析,一個控制器內部添加2個表格控制器是沒有問題的

30. Can we use one tableview with two different datasources? How you will achieve this?



  • 從對象屬性上分析,tableView只有一個dataSource屬性。固然,真要使用2個不一樣的數據源,仍是有其餘辦法解決的

31. When to use NSMutableArray and when to use NSArray?

  • 當數組元素須要動態地添加或者刪除時,用NSMutableArray
  • 當數組元素固定不變時,用NSArray

32. Give us example of what are delegate methods and what are data source methods of UITableview.

  • 代理方法:返回tableView每行的高度、監聽tableView每行的選中
  • 數據源方法:返回tableView數據的組數和行數、每行顯示什麼數據

33. How many autoreleasepool you can create in your application? Is there any limit?

  • 沒有限制

34. If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?

  • 系統會默認會不定時地建立和銷燬自動釋放池

35. When you will create an autorelease pool in your application?

  • 當不須要精確地控制對象的釋放時間時,能夠手動建立自動釋放池

36. When retain count increase?

  • 當作一次retain或者copy操做,都有可能增長計數器

37. What are commonly used NSObject class methods?

  • NSObject常見的類方法有:alloc、new、description等

38. What is convenience constructor?

  • 像NSStirng的stringWithFormat,NSNumber的numberWithInt

39. How to design universal application in Xcode?

  • 建立項目時,Device選擇Universal
  • 能夠建立一套痛用的數據模型
  • 根據iPhone\iPad選擇不一樣的控制器(iPad可能用UISplitViewController)
  • 根據iPhone\iPad選擇不一樣的界面

40. What is keyword atomic in Objective-C?

  • atomic是原子性
  • atomic會對set方法的實現進行加鎖

41. What are UIView animations?

  • UIView封裝的核心動畫能夠經過類方法/block實現

42. How can you store data in iPhone applications?

  • 屬性列表
  • Preference(NSUserDefaults)
  • 鍵值歸檔(NSKeyedArchiver、NSCoding)
  • SQLite數據庫
  • Core Data

43. What is NSManagedObject model?

  • NSManagedObject是Core Data中的實體對象

44. What is predicate?

  • 謂詞:能夠以必定條件來過濾數組、字典等集合數據,也能用在Core Data的數據查詢中

45. Objective-C有多繼承嗎?沒有的話用什麼代替?


  • OC是單繼承,沒有多繼承
  • 有時能夠用分類和協議來代替多繼承

46. Objective-C有私有方法嗎?私有變量呢?


  • OC沒有相似@private的修飾詞來修飾方法,只要寫在.h文件中,就是公共方法
  • 可使用類擴展(Extension)來增長私有方法和私有變量

47. 關鍵字const什麼含義?

const int a;

int const a;

const int *a;

int const *a;

int * const a;

int const * const a;
  • 前兩個的做用是同樣:a 是一個常整型數
  • 第3、四個意味着 a 是一個指向常整型數的指針(整型數是不可修改的,但指針能夠)
  • 第五個的意思:a 是一個指向整型數的常指針(指針指向的整型數是能夠修改的,但指針是不可修改的)
  • 最後一個意味着:a 是一個指向常整型數的常指針(指針指向的整型數是不可修改的,同時指針也是不可修改的)

48. static的做用?

  • static修飾的函數是一個內部函數,只能在本文件中調用,其餘文件不能調用
  • static修飾的所有變量是一個內部變量,只能在本文件中使用,其餘文件不能使用
  • static修飾的局部變量只會初始化一次,而且在程序退出時纔會回收內存

49. 線程和進程的區別?

  • 一個應用程序對應一個進程,一個進程幫助程序佔據一塊存儲空間
  • 要想在進程中執行任務,就必須開啓線程,一條線程就表明一個任務
  • 一個進程中容許開啓多條線程,也就是同時執行多個任務

50. 堆和棧的區別?


  • 堆空間的內存是動態分配的,通常存放對象,而且須要手動釋放內存
  • 棧空間的內存由系統自動分配,通常存放局部變量等,不須要手動管理內存

51. 爲何不少內置的類,如TableView的delegate的屬性是assign不是retain?


  • tableView的代理通常都是它所屬的控制器,控制器會對它內部的view作一次retain操做
  • 假設tableView也對代理(控制器)作一次retain操做,那麼就出現循環retain問題

52. 定義屬性時,什麼狀況使用copy、assign、retain?


  • copy:NSString、Block等類型
  • assign:非OC對象類型, 基本數據類型(兩個對象相互引用的時候,一端用retain, 一端用assign)
  • retain:OC對象類型

53. 對象是何時被釋放的?


  • 每一個對象都有一個引用計數器,每一個新對象的計數器是1,當對象的計數器減爲0時,就會被銷燬

54. tableView的重用機制?


  • 這裏只是簡述:將離開屏幕的cell放到緩存池,從新拿來顯示到屏幕的其餘位置(其餘本身詳細描述)

55. ViewController 的loadView、viewDidLoad、viewDidUnload分別是何時調用的,在自定義ViewCointroller時在這幾個函數中應該作什麼工做?

  • loadView
  • 當第一次使用控制器的view時,會調用loadView方法建立view
  • 通常在這裏自定義view
  • viewDidLoad
  • 當控制器的view建立完畢時會調用,也就是在loadView後調用
  • 通常在這裏添加子控件、初始化數據
  • viewDidUnload
  • 當控制器的view由於內存警告被銷燬時調用
  • 通常在這裏回收跟界面相關的資源(界面都會銷燬了,跟界面相關的資源確定不要了)

56. ViewController的didReceiveMemoryWarning是在何時調用的?默認的操做是什麼?


  • 當應用程序接收到系統的內容警告時,就有可能調用控制器的didRece…Warning方法
  • 它的默認作法是:當控制器的view不在窗口上顯示時,就會直接銷燬,而且調用viewDidUnload方法

57. 怎麼理解MVC,在Cocoa中MVC是怎麼實現的?


  • M:Model,模型,封裝數據
  • V:View,視圖界面,負責展現數據
  • C:Controller,控制器,負責提供數據(Model)給界面(View)

58. self.跟self->什麼區別?


  • self.是調用get方法或者set放
  • self是當前自己,是一個指向當前對象的指針
  • self->是直接訪問成員變量

59. id、nil表明什麼?

  • id類型的指針能夠指向任何OC對象
  • nil表明空值(空指針的值, 0)

60. 如何對iOS設備進行性能測試?

  • Product —> Profile —> Time Profiler

跳轉:iOS面試題總結

相關文章
相關標籤/搜索