目标C中的不可用属性是什么意思



目标C中的不可用属性做什么?

__attribute__((unavailable("message")))

Clang中有没有关于这个和其他属性的在线参考?

unavailable属性标记函数声明,以便在有人尝试使用它时可以生成错误消息。它与deprecated属性基本相同,只是尝试使用deprecated函数只会导致警告,而使用unavailable函数会导致错误。文件:http://clang.llvm.org/docs/LanguageExtensions.html

下面是一个简单的用例示例。首先是代码:

void badFunction(void) __attribute__((unavailable("Don't use badFunction, it won't work.")));
int main(void)
{
    badFunction();
    return 0;
}

然后构建它:

$ make example
cc     example.c   -o example
example.c:5:5: error: 'badFunction' is unavailable: Don't use badFunction, it
      won't work.
    badFunction();
    ^
example.c:1:6: note: function has been explicitly marked unavailable here
void badFunction(void) __attribute__((unavailable("Don't use...
     ^
1 error generated.
make: *** [example] Error 1

在不讨论singleton对象的优缺点的情况下,属性((不可用("message"))可以方便地防止singleton在标准"sharedInstance"方法之外实例化
例如,在单例管理器对象的头文件中,以下几行将阻止使用alloc、init、new或copy。

// clue for improper use (produces compile time error)
+ (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")));
- (instancetype)copy __attribute__((unavailable("copy not available, call sharedInstance instead")));

为了实例化您的单例,您需要滚动自己的自定义初始化例程。大致如下:

@interface singletonManager ()
-(instancetype)initUniqueInstance;
@end
@implementation singletonManager
+ (instancetype)sharedInstance
{
    static id instance = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&once_token,^
    {
        instance = [[super alloc] initUniqueInstance];
    });
    return instance;
}
- (instancetype)initUniqueInstance
{
    if (( self = [super init] ))
    {
        //regular initialization stuff
    }
    return self;
}
@end

最新更新