objective-c動的データ型

1398 ワード

静的データ型


特徴:
  • は、コンパイル時に変数のタイプ
  • を知る.
  • 変数にどのような属性とメソッドがあるかを知る
  • コンパイル時にこれらの属性と方法
  • にアクセスできる.
  • 静的データ型によって変数を定義し、静的データ型に属さない属性とメソッドにアクセスすると、コンパイラは
  • とエラーを報告する.

    動的データ型

  • コンパイル時にコンパイラはデータの真のタイプを知らず、実行時にのみデータの真のタイプを知る
  • 動的データ型によって定義された変数が、動的データ型に属さない属性およびメソッドにアクセスした場合、コンパイラは
  • を誤ることはありません.

    idは動的データ型##


    機能:
  • 定義変数
  • を関数とするパラメータ
  • は、関数の戻り値
  • として機能する.
  • 静的データ型により変数を定義し、サブクラス特有のメソッド
  • を呼び出すことができない.
  • 動的データ型により変数を定義することにより、サブクラス特有のメソッド
  • を呼び出すことができる.
  • 静的データ型により変数を定義することにより、サブクラスのプライベートメソッド
  • を呼び出すことができる.
    //Person Student 
    //Person eat ,Student study 
    Person *p = [Person new];
    [p eat];    //
    [p study];  // 
    Student * s = [Student new];
    [s eat];    // 
    [s study];  //
    Person *per = [Student new];// 
    //per Student , Student 
    [per eat];      //
    [per study];    // 
    
    id obj = [Person new];
    [obj eat];      //
    [obj study];    //
    id obj1 = [Student new];
    [obj1 eat];     //
    [obj1 study];   //
    

    弊害:動的データ型はいずれかのメソッドを呼び出すことができるため、自分のメソッドに属していないメソッドを呼び出す可能性があり、エラーを報告することもなく、実行時のエラーを引き起こす可能性があります.
    適用シーン:マルチステート、コード量を減らすことができます.サブクラス固有のメソッドを呼び出すのを避けるには、強制的なタイプ変換が必要です.
     , , , 
    
    if([obj isKindOfClass:[Student class]])
    {
    //isKindOfClass, , 
        [obj studyt];
    }
    if([obj isMemberOfClass:[Student class]])
    {   
    // 
        [obj student];
    }