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セクションしかし、あなたのメソッドを置く順番に依存するのは面倒です。特定の順序でメソッドを配置することなく、このコンパイラ警告の周りには何か方法がありますか?
右、どのように私の愚か。私は実装内のメソッドの順序を変更しようとしました。しかし、拡張定義 "@interface TestClass()"をファイルの先頭に移動しようとしませんでした。それは本当に、おかげで私の問題を解決します。 – Frank
@フランクもちろん、いつでも。 :) –
....この非常に疑問は、クラス拡張が最初に作成された理由です(これとreadonlyプロパティをreadwriteに昇格する機能)。クラス拡張とは異なり、クラス拡張は@interfaceで宣言されたメソッドのように*ちょうど*動作します。しかし、Jacobが答えたように、@implementationがコンパイルされる前に拡張機能を表示する必要があります。 – bbum