Objective C 中的不可用属性有什么作用?
__attribute__((unavailable("message")))
Clang 中是否有任何关于此属性和其他属性的在线参考?
Objective C 中的不可用属性有什么作用?
__attribute__((unavailable("message")))
Clang 中是否有任何关于此属性和其他属性的在线参考?
该unavailable
属性标记函数声明,以便在有人尝试使用它时生成错误消息。它本质上与deprecated
属性相同,只是尝试使用deprecated
函数只会导致警告,但使用unavailable
one 会导致错误。文档位于: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
在不讨论单例对象的优缺点的情况下,属性((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