1. 了解Objective-c
- OC是一種面向對象的語言
- 使用的是消息結構 而不是函數調用
- 消息結構:運行時執行的代碼由運行環境來決定
- 函數調用:運行時的代碼由編譯器來決定的
- OC的重要工作由“運行期組件”,而不是編譯器來完成
- OC是C語言的超集,所以C語言中的所有功能在編寫OC的代碼時也是適用的
- OC使用的動態綁定的消息結構,只有在運行的時候才會檢查對象的類型,結束到一條消息的時候,究竟應執行哪個代碼,是由運行期的環境而不是編譯器來決定
2. 在類的頭文件中盡量少引入其他的頭文件
- OC也是使用頭文件和實現文件來區隔代碼的
- 在頭文件中,如果只需要知道這是一個類,而并不需要知道這個類的實現等,則可以使用@class 類名字(即“向前聲明”);而在實現文件中,我們可能就需要知道這個類接口細節,我們就需要在實現文件中使用 #import 類名
- 頭文件的引入時機需要盡量的延后,只在必須要引入的時候才引入,這樣可以減少引入的頭文件的數量,盡量的降低類之間的耦合性
- 當無法使用向前聲明的時候,不如遵循協議的時候,盡量把“該類遵循某協議”的聲明移到“class-continuation分類中”。也可以把協議單獨放在一個頭文件中,然后將其引入
3. #import、#include、@class區別
import: 是OC種導入頭文件的關鍵字 完整的包含了文件的整個內容
- 會自動導入一次
- 不會引發交叉編譯,因為在OC是存在C++或者C的時候,使用include會導致交叉編譯
include:是C/C++導入頭文件的關鍵字
- 在OC中已經沒有這個方式來導入頭文件了
@class:僅僅是聲明一個類目,不會包含類里面的屬性實現等
- 可以解決循環依賴的問題(A引用B B引用A)
4. 多使用字面量語法,少使用與之等價的方法
- 使用字面量語法來創建字符串,數組,數組,字典。與創建此類的對象的常規方法相比較,這樣會比較的簡介扼要
- 應該通過取下標操作來訪問數組下標或者字典中的key對呀的值
- 使用字面量創建數組和字典的時候,如果值中有nil,這會拋出異常,需要確保值里面不含有nil
5.多用類型常量,少用#define預處理指令
- 不要用預處理指令定義常量。這樣定義出來的常量不包含類型信息,編譯器只是會在編譯的時候做查找替換操作,如果有人重新定義了常量值,編譯器也不會發出警告,這會導致程序中的常量值不一致
- 在實現文件中使用static const定義只在編譯單元內可見的常量,由于該常量不在全局符號表里,所以不需要在其名稱前家前綴
- 在頭文件中使用extren來聲明全局常量,并且在相關的實現文件中定義了值,這種常量會出現在全局符號表里,所以其名稱應加以區別,一般在其前面加上類名
6. 用枚舉表示狀態,選項,狀態碼
- 枚舉是一種常量的命名方式,這樣寫出來的代碼更容易讀懂。編譯器會為枚舉分配一個獨有的編號,從0開始,每個枚舉增加1.
enum DMTConnectionState {
DMTConnectionStateDisconnected,
DMTConnectionStateConnecting,
DMTConnectionStateConnected,
};
enum DMTConnectionState state = DMTConnectionStateConnected;
- 如上面的定義語法不太簡潔,我們可以使用typedef關鍵字進行重新定義,這樣我們就不需要每次都寫enum,可以直接使用DMTConnectionState 來代替 enum DMTConnectionState
typedef enum DMTConnectionState DMTConnectionState;
DMTConnectionState state = DMTConnectionStateConnected;
- C++11標準:可以指明用何種底層數據類型來保存枚舉類型的變量,這樣做的好處是,可以向前聲明枚舉變量了。若不指定底層數據類型,編譯器不清楚底層數據類型的大小,所以在用到此枚舉類型時,就不知道究竟該給變量分配多少空間。
enum DMTConnectionState : NSInteger{
DMTConnectionStateDisconnected,
DMTConnectionStateConnecting,
DMTConnectionStateConnected,
};
也可以不適用編譯器分配的序號,而是手動指定某個枚舉成員對應的值
//代碼中我們手動給DMTConnectionStateDisconnected的值是1 而不是使用的系統分配的0,接下來的幾個枚舉都會在上一個基礎上遞增1.
enum DMTConnectionState{
DMTConnectionStateDisconnected = 1,
DMTConnectionStateConnecting,
DMTConnectionStateConnected,
};
- 定義枚舉時,枚舉的選項之間可以彼此組合,可以定義枚舉的值為二進制,這樣可以通過“按位與或操作符”來進行組合
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
- Foundatin框架中定義了一些輔助的宏
typedef NS_ENUM(NSUInteger,DMTConnectionState){
DMTConnectionStateDisconnected,
DMTConnectionStateConnecting,
DMTConnectionStateConnected,
};
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};