美文网首页
[iOS]三方框架常见宏解读

[iOS]三方框架常见宏解读

作者: 未来行者 | 来源:发表于2018-03-03 16:07 被阅读31次

    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;
    }
    

    由此可以看出,initinitWithAge两个方法底层需要调用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;
    

    先写到这里了,后续再补充.

    相关文章

      网友评论

          本文标题:[iOS]三方框架常见宏解读

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