你能通过重新定义变量或方法来删除__attribute__吗?

时间:2014-08-04 10:56:29

标签: ios objective-c singleton clang

我想在.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

1 个答案:

答案 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不可用。

我希望它会有所帮助。