我想在.h
文件中创建一个不允许使用这些方法的单例(更多详情here):
+ (instancetype) alloc __attribute__((unavailable("alloc not available, call sharedInstance instead")));
- (instancetype) init __attribute__((unavailable("init not available, call sharedInstance instead")));
+ (instancetype) new __attribute__((unavailable("new not available, call sharedInstance instead")));
我可以在@interface MyClass ()
文件的.m
部分重新定义它们,以便能够在内部使用init吗?
我正在寻找类似于在标题上创建readonly
属性的内容,并在实现时将其重新定义为readwrite
(但对于__attribute__
)。
像这样:
// MyClass.h
@interface MyClass
@property (readonly) OtherClass *myThing;
@end
和
// MyClass.m
@interface MyClass ()
@property (readwrite) OtherClass *myThing;
@end
答案 0 :(得分:0)
这只能用于init方法而不能用于alloc和new。你能做的是:
//MyClass.h
@interface MyClass : NSObject
- (instancetype) init __attribute__((unavailable("init not available, call sharedInstance instead")));
+(instancetype)sharedInstance;
@end
和
//MyClass.m
@implementation MyClass
+(instancetype)sharedInstance
{
static MyClass *_sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
-(instancetype)init
{
if (self=[super init]) {
}
return self;
}
此外,如果您将使用
_sharedInstance = [[MyClass alloc] init];
而不是
_sharedInstance = [[self alloc] init];
在sharedInstance方法编译器中的会给出你输入.h文件的错误,即。 init不可用。
我希望它会有所帮助。