背景。
请考虑以下步骤:
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
文件包含在主目标中。
4) 将以下行添加到 AppDelegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[NSString new] performSelector:@selector(someMethod)];
return YES;
}
5)确保该#import "NSObject+Extension.h
行在应用程序的任何地方都不存在!
6) 运行应用程序。
输出是
2013-08-27 04:12:53.642 Experimental[32263:c07] someMethod was called
问题
我想知道应用程序中是否没有任何此类别的#import ,NSString怎么可能仍然有 NSObject+Extension 可用?这种行为让我对我声明的每个 Objective-C 类别感到非常糟糕,因为我希望我声明的类别仅在它们声明的范围内可用。例如,我希望 NSObject
Extension
仅在某个类中扩展,而不是在整个应用程序中扩展,因为否则它的全局空间会被“污染”。有没有办法避免这种行为?我确实希望我的类别仅在我明确导入它们时才起作用,而不是当我将它们链接到我用来运行的目标时。