Playing with __attributes__ (五)

objc_root_class

用法:

 __attribute__((objc_root_class))
@interface MyRootObject
@end

用途:

用于声明一个根类。在Objective-C中,有一个默认的编译Flag-Wobjc-root-class,即不允许声明一个不继承自NSObjectclass。使用这个Attribute就可以声明自定义的一个根类。
关于Root class,Apple的文档戳这里

至于自己的根类有什么用处,我也不太清楚。能知道的是,由于不继承自NSObject,意味着没有-alloc,-init等方法。似乎是没办法实例化的。

naked

用法

void foo() __attribute__((naked));

用途

llvm这样说的

This attribute disables prologue / epilogue emission for the function. This can have very system-specific consequences.

函数调用/返回时会有一些额外的工作,即对栈进行一系列操作参考1 2 3。这个Attribute会使编译器对该函数不做任何事,所以叫naked :)。在一些底层开始时会用到,比如,实现中断函数,或者直接用asm实现函数。如:

void foo() __attribute__((naked)) {
    __asm__ __volatile__ ("nop\n");
}

结语

先告一段落。前面写了4篇,最后一篇东西不多,后面发现有意思的且比较简单的Attribute也不太多了。具体还是只能细读Clang的文档。

其他参考
gnu
llvm
clang language extensions

原作写于segmentfault 链接

    原文作者:canopus4u
    原文地址: https://segmentfault.com/a/1190000004167280
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞