NS_DESIGNATED_INITIALIZER
NS_DESIGNATED_INITIALIZER
的作用是指定一个初始化方法,首先是必须以init开头,然后其他初始化方法必须调用此方法,不然编译会有警告.
见AFN
中:
- (instancetype)initWithBaseURL:(nullable NSURL *)url
sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
自己创建一个类,然后在.h文件中声明如下两个初始化方法:
//指定关键字 NS_DESIGNATED_INITIALIZER
- (instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;
//不指定关键字
- (instancetype)initWithAge:(NSInteger)age;
在.m中如下:
- (instancetype)init
{
return [self initWithName:@"allen"];
}
- (instancetype)initWithAge:(NSInteger)age{
return [self initWithName:@"allen"];
}
- (instancetype)initWithName:(NSString *)name{
self = [super init];
if (self) {
}
return self;
}
由此可以看出,init
和initWithAge
两个方法底层需要调用initWithName
才不会报警告.它的用处在于在编译期间就指定了你必须要调用的初始化方法,有助于规范你的代码,避免一些不必要的错误.
DEPRECATED_ATTRIBUTE
用于指定属性过期,常用于框架的升级过度.例如
@property(strong,nonatomic) NSString *name DEPRECATED_ATTRIBUTE;
调用的时候会有一个警告:
NS_DEPRECATED
见于MJExtension
:
#define MJExtensionDeprecated(instead) NS_DEPRECATED(2_0, 2_0, 2_0, 2_0, instead)
这里再举一个例子:
NS_DEPRECATED(10_0, 10_6, 2_0, 4_0);//表明从OSX10.6,iOS4.0之后就废弃使用了
MJExtension
里定义第五个instead
参数就是为了在你输入废弃的属性时添加一个提示需要用新的属性,或者在更高的版本可用什么API.例如:
@property(strong,nonatomic) NSString *name NS_DEPRECATED(2_0, 2_0, 2_0, 2_0,"请用tp_name替换name");
@property(strong,nonatomic) NSString *tp_name;
调用name
的时候会出现:
NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END
见于AFN的AFHTTPSessionManager
中.作用是包裹一段代码保证这一段代码中的属性和方法的参数类型都是nonull和nullable的,就不需要再重复去声明每一个参数了.
NS_ASSUME_NONNULL_BEGIN
@interface TestNullabilityClass ()
@property (nonatomic, copy) NSString *name;
- (instance)initWithCondition:(NSString *)condition;
@end
NS_ASSUME_NONNULL_END
上述name和condition默认都是nonull和nullable的了.
FOUNDATION_EXPORT
见于AFN和YYKit.
作用是定义常量,不过它比#define
方式更快, FOUNDATION_EXPORT
是比较字符串的指针,而#define
是对字符串的每个字符逐一比较的.
//.h中
FOUNDATION_EXPORT double age;
FOUNDATION_EXPORT NSString * const TPNOTIFICATIONLOGIN;
//.m中
NSString * const TPNOTIFICATIONLOGIN = @"TPNOTIFICATIONLOGIN";
double age = 10;
先写到这里了,后续再补充.
网友评论