OC中的id類型
id類型
- 靜态類型和動态類型
- 為什麼要有動态類型?
- id資料類型與靜态類型
1. 靜态類型和動态類型
-
靜态類型
将一個指針變量定義為特定類的對象時,使用的是靜态類型,在編譯的時候就知道這個指針變量所屬的類型,這個變量總是存儲特定類的對象。
Person *p person = [[Person allo] init];
-
動态類型
這一特性是程式直到執行時才确定對象所屬的類
id obj = [[Person alloc] init];
2. 為什麼要有動态類型
- NSObject是OC中的基類
- 任何對象的NSObject類型的指針可以指向任意對象
- NSObject是靜态類型,如果通過它直接調用NSObject中不存在的方法,編譯器會報錯
- 如果想通過NSObject的指針調用特定對象的方法,就必須把NSObject * 這種類型強轉成特定類型,然後進行調用。
//定義NSObject * 類型 NSObject *obj = [Cat new]; Cat *c = (Cat *)obj; [c eat];
- id是一種通用的對象類型,它可以指向屬于任何類的對象,也可以了解為萬能指針,相當于C語言的 void *
- 因為id是動态類型,是以可以通過id類型直接調用指向對象中的方法,編譯器不會報錯
// 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 obj = [Cat new]; [obj eat];//不用強制類型轉換 [obj test];//可以調用私有方法
- 注意:
- 在id的定義中,已經包好了*号。id指針隻能指向OC中的對象
- 為了盡可能的減少程式設計中出錯,Xcode做了一個檢查,當使用id類型的調用本項目中所有類中都沒有的方法,編譯器會報錯
- id類型不能使用.文法,因為.文法是編譯時特性,而id是運作時特性
3. id資料類型與靜态類型
- 雖說id資料類型可以存儲任何類型的對象,但是不要養成濫用這種通用類型的習慣
- 如果沒有使用到多态,盡量使用靜态類型
- 靜态類型可以更早的發現錯誤(發現在編譯階段而不是運作階段)
- 靜态類型能夠提高程式的可讀性
- 使用動态類型前最好判斷其真實類型
- 動态類型判斷類型
- -(BOOL)isKindOfClass:classObj 判斷執行個體對象是否是這個類或者其子類的執行個體
Person *p [Person new]; Student *stu = [Student new]; BOOL res = [p isKindOfClass:[Person class]];//YES BOOL s = [stu isKindOfClass:[Person class]];//YES
- -(BOOL)isMemberOfClass: classObj 判斷是否是這個類的執行個體
Person *p [Person new]; Student *stu = [Student new]; BOOL res = [p isMemberOfClass:[Person class]];//YES BOOL s = [stu isMemberOfClass:[Person class]];//NO
- +(BOOL) isSubclassOfClass:classObj 判斷類是否是指定類的子類
Person *p [Person new]; Student *stu = [Student new]; BOOL res = [p isSubclassOfClass:[Person class]];//NO BOOL s = [stu isSubclassOfClass:[Person class]];//YES
- -(BOOL)isKindOfClass:classObj 判斷執行個體對象是否是這個類或者其子類的執行個體
作者:SumerZZ100
連結:https://www.jianshu.com/p/8a6e5a6bad99
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。