简介:

在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__的使用的更多相关文章

  1. OC中加载html5调用html方法和修改HTML5内容

    1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...

  2. java中的继承与oc中的继承的区别

    为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...

  3. Swift: 比较Swift中闭包传值、OC中的Block传值

    一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...

  4. OC中类别、扩展、协议与委托

    一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...

  5. OC中的私有变量和description

    .OC中的私有变量 在类的实现即.m @implementation中也可以声明成员变量,但是因为在其他文件中通常都只 是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private ...

  6. Oc中的数组

    ========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...

  7. OC中面向对象2

    一. 定义OC的类和创建OC的对象 接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实现 ...

  8. OC中的面向对象语法

    一. 面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 1. 面向对象和面向过程的区别 1) 以用电脑听歌为例子 a) 面向过程 打开电脑 播放电 ...

  9. OC中的指针

    NSError *err = nil; NSError __strong **error = &err; //因为在oc中,通过* *err 创建的指针是用__strong修改的,所以要一致, ...

随机推荐

  1. form 表单跨域提交

    <!DOCTYPE html><html> <head> <title>form 表单上传文件</title> <script src ...

  2. 北京培训记day5

    高级数据结构 一.左偏树&斜堆 orz黄源河论文 合并,插入,删除根节点 打标记 struct Node { int fa,l,r,w,dep } tree[Mx]; int Merge(in ...

  3. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  4. 数据结构作业——Sanji(优先队列)

    山治的婚约 Description 我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) .山治知 ...

  5. theano broadcasting

    当我们使用函数对两个数组进行计算时,函数会对这两个数组的对应元素进行计算,因此它要求这两个数组有相同的大小(shape相同).如果两个数组的shape不同的话,会进行如下的广播(broadcastin ...

  6. Linux安装库文件(环境变量和makefile)

    CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项.这两个变量实际上涵盖了编译和汇编两个步骤. CFLAGS/CPPFLAGS: 指定头文件(.h文件)的路径, ...

  7. ASP.NET MVC Filter- 登录验证 【异步刷新列表视图】

    public class TAjaxListLoginValidateAttribute : FilterAttribute, IAuthorizationFilter { public void O ...

  8. mysql基于“报错”的注入

    报错是如何转为xss的? mysql语句在页面报错,泄露信息 ===================================================================== ...

  9. 在Node.js使用mysql模块时遇到的坑

    之前写了个小程序Node News,用到了MySQL数据库,在本地测试均没神马问题.放上服务器运行一段时间后,偶然发现打开页面的时候页面一直处于等待状态,直到Nginx返回超时错误.于是上服务器检查了 ...

  10. django(一)

    Django 自称是"最适合开发有限期的完美WEB框架".本文参考<Django web开发指南>,快速搭建一个blog 出来,在中间涉及诸多知识点,这里不会详细说明, ...