OC中的__attribute__的使用
简介:
在IOS9.2官方文档中Attributes的描述如下,简单明了:
Attributes provide more information about a declaration or type. There are two kinds of attributes in Swift, those that apply to declarations and those that apply to types.
简单来说,就是使用这种规则来对一些方法声明或者类型声明进行一个功能性描述,并且添加了一些奇特的描述,下面具体实例来看看一些有趣实用的功能。
其实,OC已经为我们将attributes封装成了一个个的很简单的宏,下面的讲解一般分为封装后和封装前的使用方法。
语法
语法如下:
__attribute__((关键字))
或者
__attribute__((关键字(参数列表)))
功能
功能1:方法的启用与废弃提醒
/* 提示在1.0开始使用 在iOS7.0后弃用 提示信息 */
+ (void)test:(NSString *)test NS_DEPRECATED_IOS(1_0, 7_0, "iOS 1.0后启用该方法,IOS7.0后弃用") ;
+ (void)fontFormat:(NSString *)iii __attribute__((availability(ios,introduced=2_0,deprecated=7_0,message="ede")));
NS_DEPRECATED_IOS(1_0, 7_0, "iOS 1.0后启用该方法,IOS7.0后弃用")这个就是OC为我们封装好的宏,第一个参数表示启用的版本号,第二个参数表示废弃的版本号,第三个参数表示当版本好处于废弃的版本号或者之后的警告信息。
__ attribute __((availability(ios,introduced=2_0,deprecated=7_0,message="ede")))该方法就是未封装前的使用方法,参数中第一个参数表示支持的系统平台,可以使用*通配符表示全部系统。
格式化字符串的检查
/* 表示的第一个参数是个格式化字符串 从第二个参数开始检查 */
+ (instancetype)stringWithFormat:(NSString *)format,... NS_FORMAT_FUNCTION(1, 2);
+ (instancetype)stringWithFormat:(NSString *)format second:(char *)format2,... __attribute__((format(printf,2,3)));
同理,第一个NS_FORMAT_FUNCTION是OC封装好的宏,第二个为原生的,但是注意,原生的使用时只能格式化检查char类型字符串,因此,如果想使用该功能,建议使用OC封装好的宏。
指定函数无返回类型
// 指定该函数 永远不会有返回
+ (NSArray *) __attribute__((noreturn)) noneReturnTest;
该指定可以用于定义一些可能中途中断方法,而导致的无返回值的情况。
警告返回值未使用
//表示警告返回值未使用
+ (BOOL)testUnUse __attribute__((warn_unused_result()));
该指定表示返回值较为重要,如果没有使用,可能会造成一些不必要的bug,因此来提醒开发者是否忘记了使用返回值。
在main函数之前或之后调用方法
__attribute__((constructor)) void before_main(){
printf("before main\n");
}
__attribute__((constructor))void agter_main(){
printf("after main\n");
}
该属性可以声明一个在main方法之前或之后调用的方法,可以用来监控main函数的行为。
OC中的__attribute__的使用的更多相关文章
- OC中加载html5调用html方法和修改HTML5内容
1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...
- java中的继承与oc中的继承的区别
为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...
- Swift: 比较Swift中闭包传值、OC中的Block传值
一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...
- OC中类别、扩展、协议与委托
一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...
- OC中的私有变量和description
.OC中的私有变量 在类的实现即.m @implementation中也可以声明成员变量,但是因为在其他文件中通常都只 是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private ...
- Oc中的数组
========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...
- OC中面向对象2
一. 定义OC的类和创建OC的对象 接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实现 ...
- OC中的面向对象语法
一. 面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 1. 面向对象和面向过程的区别 1) 以用电脑听歌为例子 a) 面向过程 打开电脑 播放电 ...
- OC中的指针
NSError *err = nil; NSError __strong **error = &err; //因为在oc中,通过* *err 创建的指针是用__strong修改的,所以要一致, ...
随机推荐
- 查找(四)-------基于B树的查找和所谓的B树
关于B树,不想写太多了,因为花在基于树的查找上的时间已经特么有点多了,就简单写写算了,如果以后有需要,或者有时间,可以再深入写写 首先说一下,为什么要有B树,以及B树是什么,很多数据结构和算法的书上来 ...
- bzoj 1070 [SCOI2007]修车
最小费用最大流. 将每个技术人员拆成车数个点,技术人员i的第j个点代表技术人员i修的倒数第j辆车. 源点向所有技术人员点连一条容量为1费用为0的边. 所有技术人员点向所有车点连边:技术人员i的第j个点 ...
- bzoj 2141: 排队
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MB Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我, ...
- js中$(function())
$(document).ready() 里的代码是在页面内容都加载完才执行的 $(document).ready(function(){})可以简写成$(function(){});
- Linux系统下设置环境变量
例如我现在有一个软件understand代码审阅软件,现在我每次想要打开这个软件就要进到~/scitools/bin/linux32目录下,去执行可执行文件understand; 但每次都这样我会觉得 ...
- python中文编码问题
第一步:在代码中输入以下命令,执行: #在Python中显示中文注释和输出中文a ="中文"print a 返回错误: d:\Python27\python.exe "D ...
- 12月6日PHPCMS取内容发布管理中的来源
调取内容发布管理中的来源,如果直接写{$val['copyfrom']}调取出来的内容为 内容|0 ,要先根据"|"进行拆分,然后再写. 示例: <!--新闻开始--& ...
- jexus /Tinyfox Owin适配器
public class Adapter { static Func<IDictionary<string, object>, Task> _owinApp; /// < ...
- Unity3D性能优化
一.美术资源优化 1.动态物体,角色.怪物.NPC (1)控制面的数量,300-2000个 (2)控制Skinner Mesh Renderer的数量,1个 (3)控制材质数量,1-3个 (4)控 ...
- C# Async, Await and using statements
Async, Await 是基于 .NEt 4.5架构的, 用于处理异步,防止死锁的方法的开始和结束, 提高程序的响应能力.比如: Application area Support ...