是否有任何编译器选项来启用警告,以尝试对全局objective-c实例进行全局初始化



最近我只是有一些人试图在我的项目的全局范围内创建一个全局实例,如下所示:

UIColor* globalColor = [UIColor red];
UIFont* globalFont = [UIFont systemFontWithSize:12];
@implementation SomeView
...
@end

这将导致性能损失,甚至在启动时崩溃。我试着写一个脚本来检查这种错误的编码行为,但是我刚刚意识到写一个完美的脚本来检查是相当困难的,尤其是当对象- C代码与c++混合时,命名空间会引入更多的麻烦。最好的解决方案将要求构建一个轻量级的词法分析器,这应该是编译器的一部分工作,所以我只是想知道是否有任何现有的编译器选项可以为这种场景启用错误或警告?谢谢!

我找不到任何编译器选项来检测这个,但是我写了一个小类别来检测意外的全局实例。在方法上设置断点将指示是否定义了全局实例。这个ApplicationEnteredMain被定义为全局BOOL,在main()被调用之前被更新为"true"。

static const char* classNameToAvoid[] = {
  "UIFont",
  "UIColor",
  "NSLocale",
  "NSBundle",
  "UIScreen",
};
@interface NSObject (AppLoadingBurdenTest)
@end
@implementation NSObject (AppLoadingBurdenTest)
+ (void)load {
  [self swizzleClassMethod:@selector(initialize) withMethod:@selector(swizzledInitialize)];
}
+ (void) swizzledInitialize {
  [self swizzledInitialize];
  if (!ApplicationEnteredMain) {
    const char* currentClassName = [NSStringFromClass(self) UTF8String];
    printf("n--------------- will initialize class <%s> before main() was called ---------------n", currentClassName);
    for (int i = 0; i < sizeof(classNameToAvoid) / sizeof(long); i++) {
      if (0 == strcmp(currentClassName, classNameToAvoid[i])) {
        ASSERT_NOT_REACHED();
      }
    }
  }
}
@end

最新更新