__attribute__ 方法名、属性标注

1. 这个是个啥

在大家做iOS开发的时候,有没有发现,你在调用系统的方法的时候,发现有些方法,会提示你过期了,或者这个方法在当前系统下不可用。我感觉很有用,就翻阅了相关文档,查看了相关文档,发现用 “attribute”标注就可以实现。

2. 关键字说明

// 功能开头
__attribute__(())
// 指定初始化方法
NS_DESIGNATED_INITIALIZER
// 标注过期
deprecated
// 标注平台
ios
// 标注开始使用版本
introduced
// 标注过期版本
deprecated
// 提示信息
message
// 标注当前方法不可用
availability
// 标注不可用版本
obsoleted

3. 继承相关的

3.1 restricted

在一个类申明的时候使用,表示该类不可被继承。

示例

// 标注该类不可被继承 相当于 java 中的 final 关键字
__attribute__((objc_subclassing_restricted))
@interface HObj : NSObject
@end

子类继承,编译的时候,会提示如下错误
屏幕快照 2018-08-30 上午11.40.57.png

3.2 INITIALIZER

初始化方法申明的时候使用,表示必须用该方法进行初始化。

示例

// 标注该类在初始化对象时,必须调用super的INITIALIZER的方法初始化
// 该类的其他初始化方法,在内部,必须调用该方法进行初始化
-(instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;

如果其他初始化方法内部为调用 【INITIALIZER】标注的方法进行初始化,编译的时候就会报如下警告

屏幕快照 2018-08-30 下午1.36.41.png

3.3 objc_requires_super

在方法中标注,表示子类重写方法时,必须调用[super xxx]

示例

// 指定子类重写的时候,必须要调用
// [super initWithAge:age]
-(instancetype)initWithAge:(int)age __attribute__((objc_requires_super));

如果子类重写父类方法时,未调用[super xxx],就会报如下警告

屏幕快照 2018-08-30 下午3.03.03.png

4. deprecated 过期标注

主要标注一个方法在什么情况下过期了

示例

// deprecated 标注过期
-(void)method1 __attribute__((deprecated("过期了")));
-(void)method3 DEPRECATED_ATTRIBUTE;
// deprecated 标注过期 [7.0,11.0]可用
-(void)method2 NS_DEPRECATED_IOS(7_0,11_0,"看看我有没有过期");
-(void)method7 CF_DEPRECATED_IOS(7_0, 11_0,"你怎么傻乎乎的");
// ios 标注平台
// introduced 标注开始使用版本
// deprecated 标注过期版本
// message 提示信息
-(void)method8 __attribute__((availability(ios,introduced=3_0,deprecated=7_0,message="你怎么傻biubiu的")));

标注的方法,调用的时候,会报如下警告

屏幕快照 2018-08-30 下午1.40.45.png

5. UNAVAILABLE 不可用标注

主要标注一个方法不可用

示例

// NS_UNAVAILABLE 标注不可用
-(void)method4 NS_UNAVAILABLE;
-(void)method5 UNAVAILABLE_ATTRIBUTE;
-(void)method6 __attribute__((unavailable("不能用了")));
// ios 标注平台
// unavailable 标注不可用
-(void)method9 __attribute__((availability(ios,unavailable,message="你怎么傻缺缺的")));
// obsoleted 标注不可用版本号
-(void)method10 __attribute__((availability(ios,introduced=3_0,deprecated=7_0,obsoleted=8_0,message="你怎么傻呵呵的")));

标注的方法,调用的时候,会报如下警告

屏幕快照 2018-08-30 下午1.40.45 2.png

6. cleanup 生命周期

该标注,主要用于监听一个对象delloc的时机,被释放的时候,可以指定调用一个方法

// 准备两个函数,用于监听对象背释放的时候的时机
void die(id *obj){
    NSLog(@"%s %@",__func__,*obj);
}
void die4block(void(^*block)(void)){
    NSLog(@"%s %@",__func__,*block);
}
// 使用
// obj挂的时候,会调用die方法
HObj *obj __attribute__((cleanup(die))) = [[HObj alloc] initWithName:@"name”];
// block挂的时候,会调用die4block方法
void(^block)(void) __attribute__((cleanup(die4block))) = ^() {};

7. overloadable 方法重载

方法重载

__attribute__((overloadable)) int add(int a,int b){
    return a+b;
}
__attribute__((overloadable)) double add(double a,double b){
    return a+b;
}
int main(int argc, char * argv[]) {
    @autoreleasepool {
        NSLog(@"%d",add(1, 2));
        NSLog(@"%lf",add(1.1, 2.2));
    }
}

结果

2018-08-30 16:25:39.008893+0800 bb[6839:878586] 3
2018-08-30 16:25:39.009314+0800 bb[6839:878586] 3.300000

你可能感兴趣的:(__attribute__ 方法名、属性标注)