Objective C中的不可用属性有什么作用?
__attribute__((unavailable("message")))
Clang中有这个和其他属性的在线参考吗?
答案 0 :(得分:12)
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
答案 1 :(得分:3)
如果不讨论单例对象的优缺点,属性((不可用("消息")))可以方便地防止单例在实例化之外被实例化标准" 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