天天看點

OC中的id類型

OC中的id類型

id類型

  1. 靜态類型和動态類型
  2. 為什麼要有動态類型?
  3. 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
                 

作者:SumerZZ100

連結:https://www.jianshu.com/p/8a6e5a6bad99

來源:簡書

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

iOS