Clang提供的源码注解__attribute__


Clang Attributes 是 Clang 提供的一种源码注解,方便开发者向编译器表达某种要求.在恰当的实际使用,可以达到一些黑魔法般的效果。

简单汇总

__attribute__((xxx))
objc_subclassing_restricted 子类不能继承
objc_requires_super     必须调用父类实现
objc_boxable            语法糖
constructor / destructor    构造器和析构器(构造器 在load方法后,main方法前,即类加载进内存,但未执行入口方法时)
overloadable  函数重载
objc_runtime_name   运行时改名字(采用映射时需特别注意)
unavailable("alloc方法不可用,请用initWithName:")

用法示例

博主较懒,因此此处简单介绍三种,其余自学

1.子类必须调用父类实现

此处有Person类和Son类,Person有 - (void)say 方法;
- (void)say __attribute__((objc_requires_super));
在子类必须重写该方法时必须掉用父类的,否则编译器会给出警告

编译器警告.png

在调用父类实现 [super say]; 之后警告消除

2.语法糖
此处构造一个结构体,通过语法糖可以让value直接通过 @() 封装起来,十分方便快捷。

typedef struct __attribute__((objc_boxable)) {
 CGFloat width,height;
} YHRect;

YHRect rect = {1,2};
NSValue *value = @(rect);
YHRect rect2;
[value getValue:&rect2];
NSLog(@"%.2f - %.2f",rect2.width,rect2.height);

3.不可用
此处示例禁止了Person类的init方法,而采用自己定义的初始化方法。

- (instancetype)init __attribute__((unavailable("init方法不可用,请用initWithObj:")));
- (instancetype)initWithObj:(id)obj;

Person *person = [[Person alloc] init];
[person say];

此处编译器会报错,错误信息为


错误信息.png

看~灰机灰过来了~灰机又灰过去了

你可能感兴趣的:(Clang提供的源码注解__attribute__)