初识 __attribute__用法

最近在看项目中的网络封装,看到里面的方法后面有个

-(void)setupViewModel NS_REQUIRES_SUPER;
而这个宏内部是
#define NS_REQUIRES_SUPER _ _ attribute__ ((objc_requires_super))

查看了一下才知道这是一种提示语,表示子类继承这个父类,需要重写这个方法,如果不写会有提示,需要重写这个 -(void)setupViewModel 方法

类似的还有

-(instancetype)init NS_UNAVAILABLE;

告诉编译器方法不可用,如果使用了就会编译失败,提示错误。比如自定义了初始化方法,为了防止别人调用init初始化,那么可以这样

黑魔法 _ attribute _ ((cleanup))

基本用法

__attribute__((cleanup(...))) ,用于修饰一个变量,在它的作用域结束时可以自动执行一个指定的方法,如:

初识 __attribute__用法
当执行完第19行代码时 会跳到 22 行的c语言静态方法

所谓作用域结束,包括大括号结束、return、goto、break、exception等各种情况。
当然,可以修饰的变量不止NSString,自定义Class或基本类型都是可以的
假如一个作用域内有若干个cleanup的变量,他们的调用顺序是先入后出的栈式顺序;
而且,cleanup是先于这个对象的dealloc调用的。

写一个高级用法 : block 参数
初识 __attribute__用法

现在执行顺序 先第30 行 —> 34行 –> 22行
理解一下 :
cleanup 方法是这个作用欲结束的时候 也就是说当 viewDidLoad 方法 的花括号结束的时候才是这个作用域结束,并且是进栈的结构,所以先调用sting的,再执行block的cleanup