聲明
typedef
typedef struct objc_method *Method
//An opaque type that represents a method in a class definition.
//當(dāng)不想公開 結(jié)構(gòu)體 objc_method *類型的時候但又必須公開的時候,可以使用Method來替換
宏
使用以下3個宏的注意點
- :這幾個宏定義只是決定代碼塊是否被編譯!
- :別忘了#endif
#if的使用說明
#if的后面接的是表達(dá)式
#if (MAX==10)||(MAX==20)
code...
#endif
它的作用是:如果(MAX==10)||(MAX==20)成立,那么編譯器就會把其中的#if 與 #endif之間的代碼編譯進(jìn)去(注意:是編譯進(jìn)去,不是執(zhí)行!?。?
#if defined的使用
#if后面接的是一個宏。
#if defined (x)
...code...
#endif
這個#if defined它不管里面的“x”的邏輯是“真”還是“假”它只管這個程序的前面的宏定義里面有沒有定義“x”這個宏,如果定義了x這個宏,那么,編譯器會編譯中間的…code…否則不直接忽視中間的…code…代碼。
另外 #if defined(x)也可以取反,也就用 #if !defined(x)
#ifdef的使用
#ifdef的使用和#if defined()的用法一致
#ifndef又和#if !defined()的用法一致。
最后強調(diào)兩點:
NS_ASSUME_NONNULL_BEGIN;
NS_ASSUME_NONNULL_END
//表示下面開始的所有方法的參數(shù)、返回值,屬性、變量都是nonnull 類型的(不可為nil或者NULL)
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
//結(jié)束
#define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
不過,為了安全起見,蘋果還制定了幾條規(guī)則:
- typedef定義的類型的nullability特性通常依賴于上下文,即使是在Audited Regions中,也不能假定它為nonnull。
- 復(fù)雜的指針類型(如id *)必須顯示去指定是nonnull還是nullable。例如,指定一個指向nullable對象的nonnull指針,可以使用”__nullable id * __nonnull”。
- 我們經(jīng)常使用的NSError **通常是被假定為一個指向nullable NSError對象的nullable指針。
- 默認(rèn)為nullable(可以為nil或者NULL)