这个是指定初始化方法,调用的什么方法最终都得调用这个方法
-(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];
}
温柔派就直接告诉外面,alloc
,new
,copy
,mutableCopy
方法不可以直接调用。否则编译不过。
+(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")));
网友评论