iPhone開発のObjective-C学習(1)Objective-Cにおける@classと#importの問題


Objective-Cで@classと#importの質問です.リファレンス .
たとえば、ClassAとClassBの2つのクラスがあります.2つのクラスが相互に使用され、circular dependency(ループ依存)が構成されています.ヘッダファイルに#importだけで相手のヘッダファイルが含まれている場合(circular inclusionsを構成し、ループが含まれている場合)、コンパイラはエラーを報告します.
Expected specifier-qualifier-list before ‘ClassA’
または
Expected specifier-qualifier-list before ‘ClassB’
ループが含まれないようにClassA.hファイルに@class classBでclassBを含め、同様に、ClassB.hファイルに@class ClassAでClassAを含めます.@class命令はコンパイラに伝えるだけで、これはクラスで、ポインタを保存するために空間を残しておけばいいです.
次はClassAでmとClassB.mには、オブジェクトを含むメンバーにアクセスする場合があります.この場合、コンパイラにより多くの情報を知らせる必要があります.たとえば、そのクラスに呼び出す方法がある場合は、#importを使用して、使用するクラスを再び含め、コンパイラに必要な追加情報を伝えなければなりません.
そうでない場合、コンパイラは警告します.
warning: receiver ‘ClassA’ is a forward class and corresponding @interface may not exist
Categoriesのあるクラスを使用する場合もあります.hヘッダファイルにCategoriesを#importで含めます.
要するに、使用原則は次のとおりです.
  • ヘッダファイルにはimportスーパークラス
  • のみ
  • メッセージファイルのimportメッセージを送信するクラス
  • 他の場所で@class転向声明
  •  
     
     
     
     
    転載先:FLYBLOG[http://www.flyblog.info]
     
     
    前に書いたように、Objective-Cに関する知識を書きたいのは、この1年間、アップルやiPhoneの開発に携わってきたためで、その中でも多くの曲がり角を歩み、他のネットユーザーからも多くの助けを得たので、自分の勉強の心得を書いて、必要な友达を参考にしたいと思っています.以下の内容は,読者に一定のソフトウェア開発経験があると仮定する.
    アップルMac OSXシステムで開発したい場合、Objective-Cは最も重要な開発言語であり、現在AppleはCocoaライブラリベースのグラフィックインタフェースに開発の重点を置いており、C++をサポートするCarbonグラフィックライブラリはすでに主導的な地位を譲っているが、CocoaライブラリはObjective-C言語を応用して開発されている.C/C++のプログラミング経験がある場合は、Objective-Cの開発が容易になります.Objective-C自体がC/c++のスーパーセットであり、C/C++のすべての特性と標準Cライブラリをサポートしていますが、文法自体はより美しく簡潔で、OO思想、つまり面向オブジェクトを体現することができます.
    Objective-Cを学ぶ前にObjective-Cを(以下、O-Cに置き換えます)、Cocoa、CarbonおよびXCodeなどいくつかの名詞の概念が明らかになり、Objective-Cは開発言語であり、前述したように、O-Cはc/c++の超集合であり、Cocoaはアップルシステム上でO-Cが実現したグラフィック開発ライブラリはwindowsシステムのwin 32 SDKとMFCに相当し、Carbonは初期のアップルオペレーティングシステム上のC/C++グラフィックライブラリもMFCに相当し、XCodeは開発であるWindowsシステムのVisual Stdioシリーズに相当する統合環境.
    以上、アップルのシステム開発の基本概念を紹介しましたが、Objective-Cの基礎知識を紹介します.
  • 変数タイプObjective-CはCのすべてのタイプをサポートし、つまりchar、unsigned char、int、long、float、doubleなどが使用できます.日付などの構造タイプの構造定義
    ?
    View Code OBJC
    1
    2
    3
    4
    5
    6
    
    struct
     Date
    {
    
    	unsigned
     char
     day;
    	unsigned
     char
     month;
    	unsigned
     char
     year;
    }
    ;

    列挙、および事前定義変数などの他のタイプは、c言語と同じ
  • である.
  • ファイル参照、タイプインポートObjective-Cでは依然として#includeを使用して他のファイルを導入することができますが、#importを使用して他のタイプをインポートすることをお勧めします.公式ドキュメントでは、エラーを減らすことができると説明しています.
  • idタイプidはObjective-Cの特殊なタイプで、彼はオブジェクトを指しています.cのvoid*
  • と理解できます.
  • 文字列Objective-Cには、「string」などのcタイプの文字列、またはNSStringタイプの文字列があり、一般的には@「string」で表され、「@」は文字列「string」をNSStringタイプ
  • に変換する.
    以上は基本的な言語知識であり、その多くはc/c++と同じであり、これまで#import以外の内容はC/C++開発者にとってよく知られていた.
    ここではまずクラスを呼び出す方法から始め、次のコードを見てみましょう.
    ?
    View Code OBJC
    1
    2
    
    [
    object method]
    ;
    [
    object methodWithParamter:
    param]
    ;

    そう、Objective-Cはこのようにメソッド呼び出しを行い、C/c++とは異なり「[]」の使用であり、[]はクラスオブジェクトを呼び出すメソッドを表し、objectはクラスオブジェクトであり、methodは呼び出されたメソッドであり、パラメータ付きのメソッドを呼び出すことができますが、メソッド名とパラメータの間に「:」を残してコンパイラにコンパイル方法を通知します.メソッドには、次のような戻り値もあります.
    ?
    View Code OBJC
    1
    2
    
    result =
     [
    object methodWithRetValue]
    ;
    result =
     [
    object methodwithPrameterAndRetValue:
    param]
    ;

    NSStringのようなクラスのメソッドを呼び出すこともできます
    ?
    View Code OBJC
    1
    
    NSString
    *
     string
     =
     [
    NSString
     string
    ]
    ;

    ここでメソッドstringはNSStringクラスの特殊なメソッドであり、c++の静的メンバー関数に似ています.
    C++のresult=object 1のような多重メソッド呼び出し.function1 ( object2.function2() );O-Cではこのように実現できます
    ?
    View Code OBJC
    1
    
    result =
     [
    object1 function1:
    [
    object2 function2]
    ]
    ;

    コードの最外層[]はobject 1呼び出しfunction 1メソッドを表し、中の[]はobject 2呼び出しfunction 2の結果をfunction 1のパラメータとして伝達する
    c/c++のobjectなどのマルチパラメータメソッド呼び出し.function(arg1, arg2,arg3 );O-Cではこのようにすべきで、まず方法の申明です
    ?
    View Code OBJC
    1
    
    -
    (
    void
    )
     function:
    (
    int
    )
    arg1 secondArg:
    (
    float
    )
     arg2 thirdArg:
    (
    NSString
    *
    )
    arg3;

    呼び出し時はこんな感じ
    ?
    View Code OBJC
    1
    
    [
    object function:
    arg1 secondArg:
    arg2 thirdArg:
    arg3]
    ;

    すなわち、メソッド名の後にパラメータのリストが直接表示されます.最初のパラメータには別名が必要ではありません.他のパラメータには別名が設定されている必要があります.O-Cはパラメータ別名を使用して呼び出されたパラメータを決定します.これにより、コンパイラはパラメータ間を1-Nのスペースで区切ることができます.