Objective-Cのクラスを本当に理解する(一)

3782 ワード

前言
このシリーズの文章はいくつかの困難な内容を紹介しているわけではありません.
重要なのは、以前の学習過程で自発的に、受動的に誤って吸収された知識を見つけて、それを脳から取り除き、人に与えた矛盾を整理することです.
しかし、Objective-Cの対象の意味を正しく理解する主線がある.
目的Objective-Cオブジェクトとクラスの定義を理解するデータ構造表現
きそ
いくつかの基礎知識を振り返ります
  • C言語の構造体の表現、typedefの意味の役割、構造体ポインタ
  • Objective-Cクラスの表現、C言語の構造体とObject-Cクラスの表現の違い
  • CとOCの言語タイプから分類されるいくつかの違いは主にruntime特性
  • から来ている.
    C言語構造体とtypedef
    C言語では、構造体(struct)は、C言語における集約データ型(aggregate data type)の一種であるデータ構造を指す.
    構造体は、より複雑なデータ構造を実現するために変数、ポインタ、または配列などとして宣言することができる.
    構造体は、構造体のメンバー(member)と呼ばれる要素の集合でもあり、これらのメンバーは異なるタイプであり、メンバーは一般的に名前でアクセスできます.
    簡単に言えば、構造体は一連のデータを集約したデータ構造である.
    構造体の定義は次のとおりです.
     struct tag { member-list } variable-list ; 
    
  • structは、構造体キーワード
  • である.
  • tagは構造体の標識であり、構造名
  • とも呼ばれる.
  • member-listは、構造体メンバーリスト
  • である.
  • variable-listは構造体宣言の変数(ここで「宣言」は動詞)
  • である.
  • 構造体宣言の末尾にセミコロン
  • を付ける
    一般的には、tagmember-listvariable-listの3つの部分が少なくとも2つ現れる
    構造体はC言語の一種である集約データ型(aggregate data type)であり、メンバー変数(member-lis)を持つのが一般的であるため、以下の2例を挙げる.
    例1では、この構造体にはラベルが明記されていない(tagが欠けている)
    struct 
    {
        int a;
        char b;
        double c;
    } s1;
    

    例2では、構造体のtagSIMPLEと命名され、変数を宣言するために使用されなかった(variable-list).
    struct SIMPLE
    {
        int a;
        char b;
        double c;
    };
    
    

    この構造体を使用して変数を宣言する方法は、次のとおりです.
    struct SIMPLE simple1;
    struct SIMPLE simple2;
    
    

    構造体変数のメンバー変数へのアクセス1(ポイント演算子)
    構造体変数のメンバー変数の方位について、. を使用して、上記で定義したstruct SIMPLEタイプのオブジェクトを例に挙げます.
    struct SIMPLE simple1;
    simple1.a = 100;
    simple1.b = 100;
    simple1.c = 0.5;
    
    

    構造体変数のメンバー変数へのアクセス2(矢印演算子)
    //       
    struct gstudent {
        char name[20];
        int age;
        float height;
        
    };
    
    //      ,            
    /*      :
        struct gstudent *     (       )
        int                   
     */
    void changeStudentHeight (struct gstudent * student,int height) {
        student->height = height;
    }
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
            //       
            struct gstudent tom = {"tom liu",25,170};
        
            changeStudentHeight(&tom,180);//tom       180  
            
            printf("tom      %f
    ",tom.height); } return 0; }

    例では
    student->height = height;
    

    オブジェクトに格納されている値の変更に関連するため、ポインタが使用されます.
    したがって、関数:
    void changeStudentHeight (struct gstudent * student,int height)
    

    パラメータには構造体ポインタがあります
    したがって、関数内で構造体オブジェクトのメンバーの値にアクセスするには、次のようにする必要があります.
    (* student).height = height;
    

    以下のように略記します.
    student->height = height;
    

    以上のように->で構造体メンバーにアクセスする方法はiOS開発者の皆さんが印象に残ると思いますが、後述します.
    構造体およびtypedefCおよびC++のtypedefキーワードは、ソースコードをより読みやすく理解するために、1つの資料タイプに新しい名前を付けるために使用される.
    簡単な解釈はtypedef宣言が元のデータ型に「同義語」を定義できることであり、彼の役割はデータ型名に等しい.typedef宣言を有効に使用すると、冗長な書き方を簡略化できます.
    struct gstudent {
        char name[20];
        int age;
        float height;
        
    };
    
    //     
    //             tag(gstudent)
    typedef struct {
        char name[20];
        int age;
        float height;
        
    }Student;
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
         //struct gstudent tom = {"tom liu",25,170};
         //  typedef             tom2
          Student tom2 ={"tom liu",25,170};
        }
        return 0;
    }
    
    
    
    

    参考:ウィキペディア、『明解C言語』