背景。NSObjectのカテゴリは、このカテゴリの.hファイルをインポートしなくても、すべてのNSObjectサブクラスで使用できます。
次の手順を検討してください:
1)Xcodeでは、新たな "シングルビューアプリケーション" を作成します。
2)は、カテゴリNSObjectの+ Extension.hとの.mファイルを作成します。
// .h
@interface NSObject (Extension)
- (void)someMethod;
@end
// .m
@implementation NSObject (Extension)
- (void)someMethod {
NSLog(@"someMethod was called");
}
@end
3)NSObject+Extension.m
ファイルをメインターゲットに含まれていることを確認してください。 #import "NSObject+Extension.h
ラインはどこにでもアプリで存在していないことを確認してください
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[NSString new] performSelector:@selector(someMethod)];
return YES;
}
5):
4)はAppDelegateに次の行を追加します!
6)アプリケーションを実行します。
出力は
2013-08-27 04:12:53.642 Experimental[32263:c07] someMethod was called
質問
どこでもアプリでこのカテゴリのいずれかの#import何が存在しない場合、私は疑問に思う、それは可能でもあるかです NSStringにはまだNSObject + Extensionがありますか?この振る舞いは私が宣言したカテゴリをのスコープ内でのみ宣言したいので、私が宣言するすべてのObjective-Cカテゴリについて非常に悪いと感じさせます。が宣言されています。たとえば、NSObjectをある種のクラスでのみ
Extension
で拡張したいのですが、アプリケーション全体ではそうではありません。そうでなければ、そのグローバル空間は "汚染された"ものになります。この現象を回避する方法はありますか?カテゴリを明示的にインポートするときにのみカテゴリを使用したいと思っています。実行するターゲットにリンクさせるだけではありません。