设置指定的初始化方法,和系统提示

2020-11-02  本文已影响0人  guoguojianshu

这个是指定初始化方法,调用的什么方法最终都得调用这个方法

-(instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;

这个方法是指定使用这个方法,进行初始化,其他的方法编译器不通过的

-(instancetype)init __unavailable;

这个方法是这个方法不能调用,

-(instancetype)initWithDate:(NSDate*)date __attribute__((unavailable));

这个方法是不能被调用,并给出原因或者是调用哪个方法

-(instancetype)initWithDate:(NSDate*)date __attribute__((unavailable("Must use initWithFoo: instead.")));

创建单例

使用GCD来创建,效率高

+(instancetype)XSShare{
    static XSPlaySongAVPlayerManager * manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (manager == nil) {
            manager = [[super allocWithZone:nil] init];
        }
    });
    return manager;
}

为了外部的调用者,使用正确的调用,得把NSObject的创建对象的方法重写,或者是不能调用(编译器不能运行通过)

由Objective-C的一些特性可以知道,在对象创建的时候,无论是alloc还是new,都会调用到 allocWithZone方法

+(instancetype)allocWithZone:(struct _NSZone *)zone{
    return [XSPlaySongAVPlayerManager XSShare];
}

在通过拷贝的时候创建对象时,会调用到-(id)copyWithZone:(NSZone *)zone-(id)mutableCopyWithZone:(NSZone *)zone方法。因此,可以重写这些方法,让创建的对象唯一。

-(id)copyWithZone:(NSZone *)zone{
    return [XSPlaySongAVPlayerManager XSShare];
}
-(id)mutableCopyWithZone:(NSZone *)zone{
    return [XSPlaySongAVPlayerManager XSShare];
}

温柔派就直接告诉外面,allocnewcopymutableCopy方法不可以直接调用。否则编译不过。

+(instancetype) alloc __attribute__((unavailable("call sharedInstance instead")));
+(instancetype) new __attribute__((unavailable("call sharedInstance instead")));
-(instancetype) copy __attribute__((unavailable("call sharedInstance instead")));
-(instancetype) mutableCopy __attribute__((unavailable("call sharedInstance instead")));
上一篇 下一篇

猜你喜欢

热点阅读