Objective-C学習編01-クラスの声明と実現

5602 ワード

Objective-Cは、アメリカ人のブレッド・確斯(Brad Cox)が1980年初めに発明したプログラム設計言語で、同時代のC++と同様に、Cにオブジェクト向けの特性を加えて拡充したものである.Objective-Cの最大の特徴はオブジェクト向けプログラミングOOP(Object Oriented Programming)をサポートすることであり、その主な特性はパッケージ、継承、多態である.
オブジェクト指向プログラミング言語である以上、クラス/オブジェクト、クラスメソッド/オブジェクトメソッド、メンバー変数などの概念もある.
文法の概要
1.クラス
クラスとは同じ特徴と行為(機能)を持つものの抽象であり、一種のデータ型に相当するが、このタイプをクラスタイプ(Class Type)と呼び、オブジェクトはこのタイプを用いて作成する変数であり、オブジェクトはクラスのインスタンス化である.
クラスを作成することは、自分で定義したデータ型に相当し、このデータ型を使用して作成された変数をオブジェクトと呼ぶ.
OCでは、クラスを2つのファイルで記述するのが一般的です.
  1> .h:メンバー変数、メソッドを宣言するクラスの宣言ファイル.クラスの宣言には、キーワード@interfaceと@endが使用されます.
注意:hのメソッドは宣言にすぎず,メソッドを実現しない.すなわち,メソッド名,メソッドの戻り値タイプ,メソッドが受信するパラメータタイプを説明するだけで,メソッド内部のコードは記述されない.
  2> .m:クラスの実装ファイルで、実装に用いる.hで宣言する方法.クラスの実装にはキーワード@implementationと@endが使用されます.
2.方法
方法はC言語の中の関数に相当するが、OCはもう関数と呼ばれず、方法と呼ばれている.
1>メソッドの宣言と実装は、+または-で始まる必要があります.
  • +はクラスメソッド(静的メソッド)を表すプラス記号「+」で修飾されたメソッドがクラスメソッドに属し、このメソッドはこのクラス呼び出し(すなわちクラス名呼び出しを用いる)
  • によってのみ使用できる.
  • -オブジェクトメソッド(ダイナミックメソッド)を表すマイナス記号「-」で修飾されたメソッドはオブジェクトメソッドに属し、このメソッドは現在のクラスで作成されたオブジェクト呼び出し
  • のみである.
    3.メンバー変数
    メンバー変数の一般的な役割ドメインは3つあります.
    1>@publicグローバルアクセス可能
    2>@protectedは、クラス内およびサブクラスでのみアクセスできます.
    3>@privateはクラス内でのみアクセス可能
    二関連クラスのコード解析
    1.Person.h-クラスの宣言ファイル
    #import <Foundation/Foundation.h> 
    @interface Person : NSObject { //   @public NSString *_name;// NSInteger _age;// NSString *_gender;// }
    // : , . - (void)sayHello; - (void)eat; - (void)sleep; @end

    a.@interfaceインタフェースの意味、Personはタイプ名、コロン:誰から受け継いだかを表し、NSObjectはOCのすべてのクラスのベースクラスであり、これらはクラスを作成した後、システムが自動的に生成し、手動でコードを書く必要はありません.
    b.大かっこ{}内にこのクラスの特徴(つまりインスタンス変数:すなわちクラスのインスタンス(オブジェクト)が持つ属性)を書き、インスタンス変数は大かっこに書かなければならない
    c.@publicインスタンス変数を@publicで修飾するとクラスの外部にアクセスできる.クラスの外部とは.h和.mファイル以外のファイルをクラスの外部と呼び、クラスの内部は.h和.mこのファイルの中
      d.NSString *_name;//NSStringはOCの文字列クラスで、非基本データ型に属し、変数を定義するときに*を追加します.
          NSInteger _age;//NSIntegerはOCの整数型で、基本データ型なので、インスタンス変数を定義するときは*を付けません.
        NSString *_gender;//性別
    OCのデータ型については、ブログを参照してください.http://www.cnblogs.com/Harbingwang/p/4995920.html
    注意://OCのタイプ(つまり非基本データ型)は、変数を宣言するときに'*'を付ける必要があります
    //C言語基本データ型にアスタリスクは不要*
    //インスタンス変数の名前はすべて''はじめに
    2. Person.m–クラスの実装ファイル
    #import "Person.h"
    
    // implementation   ,          
    @implementation Person
    // - (void)sayHello { // , , NSLog(@" ! %@, %ld , %@", _name, _age, _gender); } // - (void)eat { NSLog(@" "); }
    // - (void)sleep { NSLog(@“ , ");
    } @end

    注意:
  • もし私たちが方法を書いたら、ありません.mファイルで実現すると、mファイルに警告(Methoh definition for***not found)が表示されます.空の実装です.理由は.hに声明を書いたが、いなかった.mで
  • を実現
  • の1つのクラスの実現も書くしかない.mファイルには、クラスの宣言と実装が書かれている場合があります.mファイルは、ありませんので.hで宣言するので、このクラスは見えません.このクラスは現在のものです.mファイルのプライベートクラス
  • ペアh和.mファイルには1つのクラスしか書けないわけではなく、複数のクラスを定義できますが、一般的には1つのクラスしか書けず、管理が便利です.
  • 親が継承したメソッドが私たちのニーズを満たすことができない場合、親のメソッド
  • を書き換えることができます.
    -(id)init {
    
        _name = @"   ";
        _age = 18;
        _gender = @" ";
    return self; // self ,self }

     
      5.NSLogはOCの出力文であり、NSLogを使用して注意しなければならないのは、出力された内容は必ず@""の間に書かなければならず、@は省略できない.OC印刷文字列:OCでは文字列は単純な文字列ではなく、NSString(文字列クラス)が作成するオブジェクトに属する文字列オブジェクトである.
    %@は任意のタイプのオブジェクトのプレースホルダであり、印刷オブジェクトであれば%@でプレースホルダを使用します.
      6.@interfaceと@endはセットで使われています.@implementationと@endもセットで使われています.
     
    3オブジェクトの作成
    mainにオブジェクトを作成します.作成する前に、Personというクラスのヘッダファイルをmainに導入し、ヘッダファイル#import“Person.h”を導入します.
        1.クラスを使用してオブジェクトを作成するには1>.オブジェクトにメモリ領域を割り当てる2>.初期化
       Person *p = [[Person alloc] init];
       1>.[person alloc]スタック領域でメモリ領域を開き、メモリ領域の最初のアドレスを返します.
    上で呼び出されたallocメソッドは、メモリが割り当てられたPersonオブジェクトpを返し、等号の左側にPersonタイプを指すポインタ変数pを使用してこのオブジェクトを受信します.pの左側の*番号に注意してください.すべてのOCオブジェクトはポインタ変数で受信.クラス名で変数を定義する場合は、クラス名の後ろに必ず*番号を付けてください.
      2>.personオブジェクトの構築方法initを呼び出して初期化
      2. オブジェクトのインスタンス変数に値を割り当てる
      p->_name = @"HarbingWang";//名前に値を付ける
      p->_age = 23;//加齢
      p->_gender=@「男」;//性別に値をつける
     
    オブジェクト呼び出し方法の使用:[]大かっこはOCのメソッド呼び出し子で、メソッド呼び出し者はカッコの左側に、メソッド名はカッコの右側に、中間にスペースを残します.
      [p sayHello];//話し方を呼び出す
    OCはメッセージ送受信メカニズムを採用しており、文[p sayHello]はオブジェクトpにsayHelloのメッセージを送信するように翻訳され、pは自分がこのメッセージを実行できるかどうかを検出し、sayHelloメソッドを呼び出すことができれば、エラーを報告することはできない(Crash)