2010-12-31 4 views
0

コードは単一の警告で構築され、期待される出力「Hello、World!Objective-C拡張機能は、場合によっては「警告に応答しない可能性があります」を生成します。

例ファイル "TestClass.h"

#import <Cocoa/Cocoa.h> 
@interface TestClass : NSObject { 
} 

- (void)foobar; 
@end 

例ファイル "TestClass.m"

#import "TestClass.h" 

@implementation TestClass 
- (void)say { 
    // Compiler output "warning: 'TestClass' may not respond to '-hello'" 
    [self hello]; 
} 

- (void)hello { 
    NSLog(@"Hello, World!"); 
} 

- (void)foobar { 
    [self say]; 
} 
@end 

@interface TestClass() 
- (void)say; 
- (void)hello; 
@end 

コンパイラの警告がで "言う" 上記の "ハロー" の方法を置くことによって回避することができます@implementationセクションしかし、あなたのメソッドを置く順番に依存するのは面倒です。特定の順序でメソッドを配置することなく、このコンパイラ警告の周りには何か方法がありますか?

答えて

7

いいえ、ありません。 期間

コンパイラは、そう、ちょうどの上ご@implementationをあなたのプライベート@interface defintion を入れて、あなたが行くためにすべての良いだろうしてください、あなたのコードトップダウンを解析します。

+0

右、どのように私の愚か。私は実装内のメソッドの順序を変更しようとしました。しかし、拡張定義 "@interface TestClass()"をファイルの先頭に移動しようとしませんでした。それは本当に、おかげで私の問題を解決します。 – Frank

+0

@フランクもちろん、いつでも。 :) –

+4

....この非常に疑問は、クラス拡張が最初に作成された理由です(これとreadonlyプロパティをreadwriteに昇格する機能)。クラス拡張とは異なり、クラス拡張は@interfaceで宣言されたメソッドのように*ちょうど*動作します。しかし、Jacobが答えたように、@implementationがコンパイルされる前に拡張機能を表示する必要があります。 – bbum

関連する問題