简介:

在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. oracle Entity db.Database.SqlQuery ORA-01843: 无效的月份

    原因是oracle的日期格式化格式和本地语言环境的日期格式不一致导致的. 一般情景为oralce格式为英文格式 本地服务器或者开发机的环境为中文环境. 使用Dbcontext 实例一般不会有问题. 但 ...

  2. py-faster-rcnn之从solver文件创建solver对象,建立pythonlayer

    faster-rcnn在训练阶段,根据一个solver的prototxt文件创建相应的网络.仅凭一个prototxt就创建网络?其实还涉及到自定义的PythonLayer. 比如lib/rpn/anc ...

  3. 【codeforces 442B】 Andrey and Problem

    http://codeforces.com/problemset/problem/442/B (题目链接) 题意 n个人,每个人有p[i]的概率出一道题.问如何选择其中s个人使得这些人正好只出1道题的 ...

  4. HDU 4081Qin Shi Huang's National Road System(次小生成树)

    题目大意: 有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点.秦始皇希望这所有n-1条路长度之和最短.然后徐福突然有冒出来,说是他有魔法,可以不用人力.财力就变 ...

  5. Python OOP(面向对象编程)

    一OOP的作用 在Python中,类是面向对象设计(OOP)的主要工具.通过使用类这种工具,OOP可以: 1.分解代码,最小化代码的冗余. 2.通过定制现有的代码,来编写新的程序,而不用在原处进行修改 ...

  6. java -- 容易放错的误区

    1.按值传递 和 引用传递 (基本类型包括基本类型的包装类 或者 字符串类型 传递的是 副本 并不会改变原来的值)||  如果是引用类型 传递的是地址,会改变原来的值. public class T ...

  7. Nginx中root与alias的用法及区别:

    Nginx中root与alias都是定义location {}块中虚拟目录访问的文件位置: 先看看两者在用法上的区别: location /img/ { alias /var/www/image/; ...

  8. 怎么把本地项目和远程git仓库相连通

    1. 打开在你的项目文件夹,输入下面的命令 git init 输完上面的命令,文件夹中会出现一个.git文件夹,如下图所示,其他的的文件也会出现蓝色小问号的标志 2. 添加所有文件 git add . ...

  9. 三种执行SQL语句的的JAVA代码

    问题描述: 连接数据库,执行SQL语句是必不可少的,下面给出了三种执行不通SQL语句的方法. 1.简单的Statement执行SQL语句.有SQL注入,一般不使用. public static voi ...

  10. ActiveMQ集群下的消息回流功能

    ------------------------------------------------------------------ "丢失"的消息 如果有broker1和brok ...