1、__attribute__一般用来设置函数属性、变量属性、类型属性等
格式:__attribute__(xxx) xxx:即参数
官方例子:NSLog
#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
format属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。
对于format参数的使用如下
format (archetype, string-index, first-to-check)
archetype指定哪种风格,这里是__NSString__
string-index指定传入的第几个参数是格式化字符串
first-to-check指定第一个可变参数所在的索引
2、availability属性
availability属性是一个以逗号为分隔的参数列表,以平台的名称开始,包含一些放在附加信息里的一些里程碑式的声明。
可以设置废弃的方法,简单例子:
- (void)oldMethod:(NSString *)string __attribute__((availability(ios,introduced=2_0,deprecated=7_0,message="用 -newMethod: 这个方法替代 "))){
NSLog(@"我是旧方法,不要调我");
}
- (void)newMethod:(NSString *)string{
NSLog(@"我是新方法");
}
//注:如果经常用,建议定义成类似系统的宏
#define MX_DEPRECATED_IOS(_iosIntro,_iosDep,...) __attribute__((availability(ios,introduced=_iosIntro,deprecated=_iosDep,message=""__VA_ARGS__)))
上面的例子就变成这样:
- (void)oldMethod:(NSString *)string MX_DEPRECATED_IOS(2_0,7_0,"用 -newMethod: 这个方法替代 "){
NSLog(@"我是旧方法,不要调我");
}
- (void)newMethod:(NSString *)string{
NSLog(@"我是新方法");
}
3、unavailable属性
告诉编译器该方法不可用,如果强行调用编译器会提示错误。
例子:
#define UNAVAILABLE_ATTRIBUTE __attribute__((unavailable))
#define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE
4、NSObject属性
例子:
@property (nonatomic,strong) __attribute__((NSObject)) CFDictionaryRef myDictionary;
CFDictionaryRef属于CoreFoundation框架的,也就是非OC对象,加上attribute((NSObject))后,myDictionary的内存管理会被当做OC对象来对待.
另外一个例子:
typedef __attribute__((NSObject)) CGGradientRef GradientObject;
@property (nonatomic, strong) GradientObject storedGradient;
CGGradientRef属于Core Graphics框架,非OC对象,首先将CGGradientRef起别名为GradientObject,并使其内存管理会被当做OC对象来对待.
格式:__attribute__(xxx) xxx:即参数
官方例子:NSLog
#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
format属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。
对于format参数的使用如下
format (archetype, string-index, first-to-check)
archetype指定哪种风格,这里是__NSString__
string-index指定传入的第几个参数是格式化字符串
first-to-check指定第一个可变参数所在的索引
2、availability属性
availability属性是一个以逗号为分隔的参数列表,以平台的名称开始,包含一些放在附加信息里的一些里程碑式的声明。
可以设置废弃的方法,简单例子:
- (void)oldMethod:(NSString *)string __attribute__((availability(ios,introduced=2_0,deprecated=7_0,message="用 -newMethod: 这个方法替代 "))){
NSLog(@"我是旧方法,不要调我");
}
- (void)newMethod:(NSString *)string{
NSLog(@"我是新方法");
}
//注:如果经常用,建议定义成类似系统的宏
#define MX_DEPRECATED_IOS(_iosIntro,_iosDep,...) __attribute__((availability(ios,introduced=_iosIntro,deprecated=_iosDep,message=""__VA_ARGS__)))
上面的例子就变成这样:
- (void)oldMethod:(NSString *)string MX_DEPRECATED_IOS(2_0,7_0,"用 -newMethod: 这个方法替代 "){
NSLog(@"我是旧方法,不要调我");
}
- (void)newMethod:(NSString *)string{
NSLog(@"我是新方法");
}
3、unavailable属性
告诉编译器该方法不可用,如果强行调用编译器会提示错误。
例子:
#define UNAVAILABLE_ATTRIBUTE __attribute__((unavailable))
#define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE
4、NSObject属性
例子:
@property (nonatomic,strong) __attribute__((NSObject)) CFDictionaryRef myDictionary;
CFDictionaryRef属于CoreFoundation框架的,也就是非OC对象,加上attribute((NSObject))后,myDictionary的内存管理会被当做OC对象来对待.
另外一个例子:
typedef __attribute__((NSObject)) CGGradientRef GradientObject;
@property (nonatomic, strong) GradientObject storedGradient;
CGGradientRef属于Core Graphics框架,非OC对象,首先将CGGradientRef起别名为GradientObject,并使其内存管理会被当做OC对象来对待.