2012-01-12 13 views
6

私はスタンフォード大学のiPadとiPhoneアプリケーション開発コースビデオを見ています。インストラクターはビデオ内で、UIオブジェクトを実装ファイルにドラッグ&ドロップしてアクションを作成することができます。しかし、この方法では、メソッドはヘッダーファイルで宣言しません。これは、.mファイルにメソッドを実装しても、.hファイルに宣言しても問題ないのですか?ヘッダファイルにメソッドを宣言することはできませんか?

答えて

6

あなたは

のObjective-Cの動的メソッドを使用しています:-) "OK" を定義する方法によって異なります参照( "private"、 "public"など)指定子を実際に実行するわけではありません。だから、には、ヘッダファイル内のメソッドを宣言するために、が必要です。

あなたがそうではないと説得しない限り、かなりの量の型チェックが行われるので、コンパイラと戦うことになります。

5

実装のすべてのメソッドをヘッダファイルに宣言する必要はありません。しかし、ヘッダーファイルにない場合は、別のファイルのリテラル名で参照することはできません。また、実装ファイルでそれらを "前方参照"することもできません。

(これは正規Cからの異なるではないが、C++におけるクラスのメソッドとは異なることに注意してください。)

+0

コンパイラの動作は、Xcodeの4.5に多少変更されているようです。私は.hで宣言しなかったたくさんのメソッドを持っており、コンパイルエラーは発生しません。私はXcodeの4.2にこのコードを取るときしかし、私は、コンパイラはエラーをスローのiOS 4.3との互換性を確認することができます。 – JScarry

+0

@JScarry - コンパイラフラグのいくつかの並べ替えによって変化しているようですけれども、私は、同様の動作を気づきました。しかし、Xcode 4。5は.m内の '@ interface'の'() 'バージョンの使用を押しています。そこに内部宣言をすべて張り付けることができます。 –

5

をそれが特定の状況下で、はいヘッダのメソッドを宣言しないように「OK」です。たとえば、ARCを使用する場合、コンパイラは一般的にメソッドシグネチャを知る必要があるため、正しいことを行うことができます。しかし、基本的には、メソッドを使用している場合は、呼び出すメソッドについて既に知っている必要があります。

あなたがInterface Builderの話をしているので、それはそれはあなたのヘッダーと実装ファイルの全体の文脈「を参照してください」とメソッドが存在することを知ることができるので、それはすべてのメソッドについて知っているという点でわずかに異なるのです。すなわち上記の私の用語では、メソッドは使用前に定義されています。使用前に定義に関して

、一般的に受け入れられているアプローチはどちらかである:

  1. は、インターフェイスファイル(.H)でメソッドを定義します。例えば:

    MyClass.h

    @interface MyClass : NSObject 
    - (void)someMethod; 
    @end 
    

    MyClass.m

    @implementation MyClass 
    - (void)someMethod { 
        // do something 
    } 
    @end 
    
  2. がクラス継続カテゴリ内のメソッドを定義します。例えば:

    MyClass.h

    @interface MyClass : NSObject 
    @end 
    

    MyClass.m

    @interface MyClass() 
    - (void)someMethod; 
    @end 
    
    @implementation MyClass 
    - (void)someMethod { 
        // do something 
    } 
    @end 
    
関連する問題