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));
在子类必须重写该方法时必须掉用父类的,否则编译器会给出警告
在调用父类实现 [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
看~灰机灰过来了~灰机又灰过去了
网友评论