跳轉:iOS面試題總結
- 1. #import 跟#include、@class有什么區別?#import<> 跟 #import""又什么區別?
- 2. 屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那種情況下用?
- 3. 寫一個setter方法用於完成@property(nonatomic,retain)NSString *name,寫一個setter方法用於完成@property(nonatomic,copy)NSString *name.
- 4. 對於語句NSString*obj = [[NSData alloc] init]; ,編譯時和運行時obj分別是什么類型?
- 5. 常見的object-c的數據類型有那些, 和C的基本數據類型有什么區別?
- 6. id 聲明的變量有什么特性?
- 7. Objective-C如何對內存管理的,說說你的看法和解決方法?
- 8. 內存管理的幾條原則時什么?按照默認法則,哪些方法生成的對象需要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?
- 9. 看下面的程序,三次NSLog會輸出什么?為什么?
- 10. OC中創建線程的方法是什么?如果指定在主線程中執行代碼?如何延時執行代碼?
- 11. Difference between shallow copy and deep copy?
- 12. What is advantage of categories? What is difference between implementing a category and inheritance?
- 13. Difference between categories and extensions?
- 14. Difference between protocol in Objective-C and interfaces in Java?
- 15. What are KVO and KVC?
- 16. What is purpose of delegates?
- 17. What are mutable and immutable types in Objective C?
- 18. When we call Objective-C is runtime language what does it mean?
- 19. What is difference between NSNotification and Protocol?
- 20. What is push notification?
- 21. What is Polymorphism?
- 22. What is Singleton?
- 23. What is Responder Chain?
- 24. Difference between frame and bounds?
- 25. Difference between method and selector?
- 26. Is there any garbage collection mechanism in Objective-C?
- 27. What is NSOperation queue?
- 28. What is lazy loading?
- 29. Can we use two tableview controllers on one viewcontroller?
- 30. Can we use one tableview with two different datasources? How you will achieve this?
- 31. When to use NSMutableArray and when to use NSArray?
- 32. Give us example of what are delegate methods and what are data source methods of UITableview.
- 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?
- 37. What are commonly used NSObject class methods?
- 38. What is convenience constructor?
- 39. How to design universal application in Xcode?
- 40. What is keyword atomic in Objective-C?
- 41. What are UIView animations?
- 42. How can you store data in iPhone applications?
- 43. What is NSManagedObject model?
- 44. What is predicate?
- 45. Objective-C有多繼承嗎?沒有的話用什么代替?
- 46. Objective-C有私有方法嗎?私有變量呢?
- 47. 關鍵字const什么含義?
- 48. static的作用?
- 49. 線程和進程的區別?
- 50. 堆和棧的區別?
- 51. 為什么很多內置的類,如TableView的delegate的屬性是assign不是retain?
- 52. 定義屬性時,什么情況使用copy、assign、retain?
- 53. 對象是什么時候被釋放的?
- 54. tableView的重用機制?
- 55. ViewController 的loadView、viewDidLoad、viewDidUnload分別是什么時候調用的,在自定義ViewCointroller時在這幾個函數中應該做什么工作?
- 56. ViewController的didReceiveMemoryWarning是在什么時候調用的?默認的操作是什么?
- 57. 怎么理解MVC,在Cocoa中MVC是怎么實現的?
- 58. self.跟self->什么區別?
- 59. id、nil代表什么?
- 60. 如何對iOS設備進行性能測試?
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類型
-
運行時是NSData類型
5. 常見的object-c的數據類型有那些, 和C的基本數據類型有什么區別?
- 常用OC類型:NSString、NSArray、NSDictionary、NSData、NSNumber等
- OC對象需要手動管理內存,C的基本數據類型不需要管理內存
6. id 聲明的變量有什么特性?
- id聲明的變量能指向任何OC對象
7. Objective-C如何對內存管理的,說說你的看法和解決方法?
-
每個對象都有一個引用計數器,每個新對象的計數器是1,當對象的計數器減為0時,就會被銷毀
-
通過retain可以讓對象的計數器+1、release可以讓對象的計數器-1
-
還可以通過autorelease pool管理內存
-
如果用ARC,編譯器會自動生成管理內存的代碼
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]);
// 結果:3、2、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
-
If the text field does not handle an event, UIKit sends the event to the text field’s parent
UIView
object, 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 theUIApplication
object, and possibly to the app delegate if that object is an instance ofUIResponder
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 是一個常整型數
- 第三、四個意味着 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面試題總結