以下面的代碼,obj
在編譯時和運行時分別時什麼類型的對象:ios
1
2
3
|
NSString *obj = [[NSData alloc] init];
|
參考答案:面試
在編譯時,咱們所聲明的obj
是NSString *
類型,所以是NSString
類型對象。在運行時,因爲指針obj
所指向的是NSData
類型對象的內存,所以其實是NSData
類型的對象。在編譯時,這一行代碼會轉換成相似這樣:設計模式
1
2
3
4
|
NSString *obj = ((id (*)(id, SEL))objc_msgSend)([NSData class], @selector(alloc));
obj = ((id (*)(id, SEL))objc_msgSend)((id)obj, @selector(init));
|
因爲在編譯時,轉換成id
,所以能夠用NSString *
指向NSData
對象,而id
是具有運行時特性的,所以在連接時,經過id
的isa
指針能夠找到其所屬的類,所以最終類型仍是經過isa
肯定其所屬類型。api
id
類型能夠指向任何類型的對象。數組
參考答案:安全
咱們先看看其定義:性能
1
2
3
4
5
6
7
8
9
|
/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
|
可其定義可知id
類型是一個指向objc_object
結構體類型的指針,這個結構體只有一個指向對象無類的指針isa
,所以id
能夠指向任何類型的對象,故其具有運行時特性。測試
在實際開發中,咱們常常須要對應用瘦身,所以對性能的檢測是很重要的。spa
參考答案:線程
使用Profile
-> Instruments
->Time Profiler
能夠檢測性能。
我記得曾經我就被這麼問過,不知道你們有沒有遇到過。
參考答案:
在類的.m
實現文件內聲明,就能夠做爲私有方法、私有變量。可是,並非絕對的私有,若是外部知道有這麼個方法,同樣能夠調用,並且不會報錯。就像蘋果公司沒有公開出來的API
,只要咱們經過其它方式瞭解到api
就能夠調用。因而蘋果審覈時常常因爲使用了私有api
而打回來了。
曾經筆者面試時,也被問到這個問題。
參考答案:
1
2
3
|
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]
|
cell
指定一樣的重用標識(固然,能夠爲不一樣顯示類型的cell指定不一樣的標識)而且10個cell
將所有都加入到visiableCells
數組,reusableTableCells
爲空.tableView
,當有一個cell
徹底移出屏幕時,這個cell
就會被加入到reusableTableCells
。而新出現的那個cell
將加入到visiableCells
,而這個cell
就是被重用的。若是要讓tableview
不重用,不設置reuseIdentifier
就能夠了。
參考答案:
nil
和C
語言的NULL
相同,在objc/objc.h
中定義。nil
表示Objective-C
對象的值爲空。在C
語言中,指針的空值用NULL
表示。在Objective-C
中,nil
對象調用任何方法表示什麼也不執行,也不會崩潰。
更詳細請閱讀筆者的文章:http://www.henishuo.com/nil-nil-null-nsnull-difference/
參考答案:
Category
就是所謂的擴展。
有時咱們須要在一個已經定義好的類中增長一些方法,而不想去重寫該類,這時候使用擴展就很好。好比,當工程已經很大,代碼量比較多,或者類中已經有不少方法,已經有其餘代碼調用了該類建立對象並使用該類的方法時,可使用類別對該類擴充新的方法。
筆者所到公司之處,都會根據公司的UI
風格定製一套UI
組件,統一全局的風格。本人向來不喜歡用xib/storyboard
開發,由於維護成本過高了。咱們不能經過繼承的方式定製各類組件吧?因此這個時候使用擴展是最佳時期。
參考答案:
Delegate
就是所謂的代理,代理是一種設計模式。在iOS
開發中,會使用到大量的代理,而代理設計模式是蘋果中的標準設置模式。
經常使用場景有反向傳值。好比:蘋果的藍牙,咱們進入到下一個界面去打開或者關閉藍牙,當操做以後須要將狀態反饋到前一個界面,並更新顯示。對於這種狀態,使用代理設計模式是很標準的模式。
參考答案:
單例就是全局都只有一個對象存在,並且是在整個App
運行過程當中都存在。每一個App
都會有單例,好比UIApplication
。而咱們在作用戶數據存儲時,一般都會用單例存儲,由於應用在全部操做中,常常要求先登陸。
下面這種寫法是最經常使用的寫法,這個是線程安全的。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
+ (instancetype)shared {
static HYBUserManager *sg_userManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (sg_userManager == nil) {
sg_userManager = [[HYBUserManager alloc] init];
}
});
return sg_userManager;
}
|
參考答案:
在iOS
中,通知是很是經常使用的設計模式。它是多對多的關係。關於通知,因爲這一節比較重要,單獨寫成一篇文章,在個人隨筆中有詳細的解釋,感興趣的能夠前去看一看。
文章中不免有說得不合理的地方,若是您認爲說法不正確或者哪裏有錯誤的地方,請在評論中留言,筆者會在第一時間修正!!!