2012-03-10 6 views
2

たちは、親クラスカテゴリを持つクラスをサブクラス化するときにコンパイル警告を避けるには?

ParentViewController.h

@interface ParentViewController 

.... 

@end 

ParentViewController.m我々はそれをサブクラス

@interface ParentViewController() 

- (NSArray *)selectedItems; 

@end 

@implementation ParentViewController 

..... 

@end 

そして

ChildViewController.h

@interface ChildViewController : ParentViewController 

.... 

@end 
を持っていると言います

ChildClassViewController.m

@implementation ChildViewController 

- (void)doSomething 
{ 
    // XCode Warning Flag on this line 
    NSUInteger count = [self selectedItems]; 

    ..... 
} 

Xcodeはコメント行で警告フラグを設定し、「インスタンスメソッドは、 『-selectedItems』( 『ID』の戻り型のデフォルト)を見つからないと言うであろう。

はい私はObjCではプライベートメソッドのようなものはありませんが、空のカテゴリを使用するとそのようにすることができます。しかし、何とかそれはサブクラスによって継承されません。

私は通常、メソッドをParentViewController.mからParentViewController.hに移動して修正します。私はそれをサブクラス化する必要があるので、私はメソッドを非公開にする能力が失われています。

は今、私の質問は:

  1. なぜ親サブクラスは、.mファイルでその範疇に宣言されているこれらの方法を見つけることができないのですか?

  2. 警告フラグは削除できますが、メソッドを非公開にすることはできません。

もっと熟練した人がこの厄介な問題を説明するのに役立ちます。

答えて

3

まず、「空のカテゴリ」はカテゴリではなく、クラス拡張です。クラスと非常によく似ているクラス拡張ですが、Objective C 2.0で新しく追加されました。主に、クラス拡張でメソッドを実装していない場合は警告が表示されますが、カテゴリには含まれません。とにかく、手元の問題に...

Objective-Cのプライバシーはすべて可視性に関するものです。コンパイラが使用されているメソッドの宣言を見ることができない場合は、警告が表示されます。クラス拡張と同じファイルにサブクラスを実装する場合、コンパイラは宣言を見ることができるので警告しません。

したがって、サブクラスで「プライベート」メソッドを使用するには、それらのメソッドが存在することをコンパイラーに示す何らかの方法が必要です。私の好きなパターンは、(MyClass_private.hのような)別々のファイルのカテゴリ内のプライベートメソッドを宣言することです。次に、そのインタフェースを、基本クラスのインプリメンテーションファイルと、それを参照する必要がある派生クラスにインポートします。

+0

これはうまくいきます。同じ.mファイル内で親とサブクラスを組み合わせることは、大きなものであるためオプションではありません。それらのプライベートメソッドを別々のファイルに配置するのは面倒です。私はこの答えを受け入れるだろう、私は他の方法があるとは思わない。 –

+0

@SamuelChandra、ええ、同じファイルポイントはちょっとしたものでした。あなたはおそらくそれをするべきではありません。 –

2

私は解決策を持っていますが、一般的には反対です。 -wを指定してファイルをコンパイルすると(警告はすべて表示されません)、警告は消えます。このメッセージに特定の警告フラグがあるかどうかわかりませんが、もしあれば#pragma GCC diagnostic ignored "-Winstance-method-not-found"を使用できますが、私はそれを見つけることができません、ごめんなさい。

+0

+1:正解ですが、それに対しても助言します。これらの警告は時間の99%で便利です:) –

+0

-wすべての警告を抑制しますが、残念ながら私が取ることのできるオプションではありません。ありがとう –

関連する問題