13

Objective C 中的不可用属性有什么作用?

__attribute__((unavailable("message")))

Clang 中是否有任何关于此属性和其他属性的在线参考?

4

2 回答 2

14

unavailable属性标记函数声明,以便在有人尝试使用它时生成错误消息。它本质上与deprecated属性相同,只是尝试使用deprecated函数只会导致警告,但使用unavailableone 会导致错误。文档位于: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
于 2013-06-23T15:25:30.997 回答
4

在不讨论单例对象的优缺点的情况下,属性((unavailable("message"))) 可以方便地防止在标准“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
于 2015-08-13T19:56:22.243 回答