iOS开发-获取全部环境变量iOS开发-获取全部环境变量

2021-08-09 11:21:05 浏览数 (1)

在日常的开发中,有时候需要配置环境变量来简化开发。

1、 环境变量的设置

在Xcode中选中Target然后打开Edit Scheme,当前打开OBJC_PRINT_LOAD_METHODS环境变量。

  • OBJC_PRINT_LOAD_METHODS: 打印出项目中所有load方法的调用,可以方便开发中监控load方法数量(load方法是会影响启动速度)。
1.1 输出结果
  • 打开load方法的打印"开关"之后,可以看到在lldb中打印出所有load方法的调用,当然有系统的、还有开发者自定义的( HRTest load)

2、 获取所有环境变量

在当前objc-818中系统共提供了44个环境变量

2.1 通过objc获取

在OC底层探索02- objc4-781 源码编译中有objc4-818可执行源码的获取方式。

libobjc4-818中搜索_objc_init。发现了environ_init();有关于环境变量初始化方法的相关线索。

代码语言:javascript复制
void environ_init(void) 
{
    ...
   //在该方法的最下方添加下面的代码
for (size_t i = 0; i < sizeof(Settings)/sizeof(Settings[0]); i  ) {
        const option_t *opt = &Settings[i];
        _objc_inform("%s: %s", opt->env, opt->help);
        _objc_inform("%s is set", opt->env);
    }
}
  • 然后执行代码就可以看到lldb中的打印了。
2.2 终端方式

在终端的任意位置输入:export OBJC_HELP=1

3、环境变量汇总

环境变量

说明

OBJC_PRINT_OPTIONS

输出OBJC已设置的选项

OBJC_PRINT_IMAGES

输出已load的image信息

OBJC_PRINT_LOAD_METHODS

打印 Class 及 Category 的 (void)load 方法的调用信息

OBJC_PRINT_INITIALIZE_METHODS

打印 Class 的 (void)initialize 的调用信息

OBJC_PRINT_RESOLVED_METHODS

打印通过 resolveClassMethod: 或 resolveInstanceMethod: 生成的类方法

OBJC_PRINT_CLASS_SETUP

打印 Class 及 Category 的设置过程

OBJC_PRINT_PROTOCOL_SETUP

打印 Protocol 的设置过程

OBJC_PRINT_IVAR_SETUP

打印 Ivar 的设置过程

OBJC_PRINT_VTABLE_SETUP

打印 vtable 的设置过程

OBJC_PRINT_VTABLE_IMAGES

打印 vtable 被覆盖的方法

OBJC_PRINT_CACHE_SETUP

打印方法缓存的设置过程

OBJC_PRINT_FUTURE_CLASSES

打印从 CFType 无缝转换到 NSObject 将要使用的类(如 CFArrayRef 到 NSArray * )

OBJC_PRINT_GC

打印一些垃圾回收操作

OBJC_PRINT_PREOPTIMIZATION

打印 dyld 共享缓存优化前的问候语

OBJC_PRINT_CXX_CTORS

打印类实例中的 C 对象的构造与析构调用

OBJC_PRINT_EXCEPTIONS

打印异常处理

OBJC_PRINT_EXCEPTION_THROW

打印所有异常抛出时的 Backtrace

OBJC_PRINT_ALT_HANDLERS

打印 alt 操作异常处理

OBJC_PRINT_REPLACED_METHODS

打印被 Category 替换的方法

OBJC_PRINT_DEPRECATION_WARNINGS

打印所有过时的方法调用

OBJC_PRINT_POOL_HIGHWATER

打印 autoreleasepool 高水位警告

OBJC_PRINT_CUSTOM_RR

打印含有未优化的自定义 retain/release 方法的类

OBJC_PRINT_CUSTOM_AWZ

打印含有未优化的自定义 allocWithZone 方法的类

OBJC_PRINT_RAW_ISA

打印需要访问原始 isa 指针的类

OBJC_DEBUG_UNLOAD

卸载有不良行为的 Bundle 时打印警告

OBJC_DEBUG_FRAGILE_SUPERCLASSES

当子类可能被对父类的修改破坏时打印警告

OBJC_DEBUG_FINALIZERS

警告实现了 -dealloc 却没有实现 -finalize 的类

OBJC_DEBUG_NIL_SYNC

警告 @synchronized(nil) 调用,这种情况不会加锁

OBJC_DEBUG_NONFRAGILE_IVARS

打印突发地重新布置 non-fragile ivars 的行为

OBJC_DEBUG_ALT_HANDLERS

记录更多的 alt 操作错误信息

OBJC_DEBUG_MISSING_POOLS

警告没有 pool 的情况下使用 autorelease,可能内存泄漏

OBJC_DEBUG_DUPLICATE_CLASSES

当出现类重名时停机

OBJC_USE_INTERNAL_ZONE

在一个专用的 malloc 区分配运行时数据

OBJC_DISABLE_GC

强行关闭自动垃圾回收,即使可执行文件需要垃圾回收

OBJC_DISABLE_VTABLES

关闭 vtable 分发

OBJC_DISABLE_PREOPTIMIZATION

关闭 dyld 共享缓存优化前的问候语

OBJC_DISABLE_TAGGED_POINTERS

关闭 NSNumber 等的 tagged pointer 优化

OBJC_DISABLE_NONPOINTER_ISA

关闭 non-pointer isa 字段的访问

总结

掌握了这些环境变量,可以帮助我们在以后开发中事半功倍。

0 人点赞