__attribute__在Objective-C中的运用

__attribute__机制是GNU C的一大特色,增强编译器的功能,带来更多的检查,更多的优化。可以设置函数特性,变量特性,类型特性,标签特性,枚举特性,语法格式是__attribute__((attributes))。不同的编译器在细节上会有差别,持有的特性也不尽相同。下面介绍几种Objective-C中可以使用的特性。

  • __attribute__((deprecated))
    可以用来修饰变量,方法,类和协议,表明被废弃,如果使用,编译器会发出警告。可以添加说明,用法__attribute__((deprecated("use Another class.")))。

  • __attribute__((unavailable))
    可以用来修饰变量,方法,类和协议,表明不可用,如果使用,编译器会发出错误。同deprecated,可以添加说明。

  • __attribute__((NSObject))
    用来修饰属性,表明Core Fundation类型的属性应该按照Objective-C的对象来进行内存管理。比如 @property(retain) __attribute__((NSObject)) CFDictionaryRef myDictionary;

  • __attribute__((objc_designated_initializer))
    用来修饰类的designated initializer初始化方法,如果修饰的方法里没有调用超类的 designated initializer,编译器会发出警告。可以简写成NS_DESIGNATED_INITIALIZER。

  • __attribute__((constructor))
    用来修饰函数,函数的返回值为void,参数为void,会在main函数开始之前调用。可以指定优先级(大于100,0到100为系统保留),多个修饰的函数,按照优先级高低顺序执行。

  • __attribute__((destructor))
    用来修饰函数,返回值和参数同constructor,会在main函数结束之后调用。优先级同constructor。

deprecated、unavailable、NSObject、objc_designated_initializer应该涵盖了大部分的应用场景,constructor/destructor 目前只在libextobjc中见到运用,在main函数之前可以干很多黑魔法的事。

更多__attribute__介绍,可以参考 http://blog.sunnyxx.com/2016/05/14/clang-attributes/

你可能感兴趣的:(__attribute__在Objective-C中的运用)