美文网首页C++
Clang提供的源码注解__attribute__

Clang提供的源码注解__attribute__

作者: CatLogic | 来源:发表于2016-06-14 11:31 被阅读0次

    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__

        本文链接:https://www.haomeiwen.com/subject/uscudttx.html