[iOS]__attribute__

标签: iOS
2016-09-07 19:41 107人阅读 评论(0) 收藏 举报
 分类:
iOS开发(52) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

今天看博客看到了sunnyxx大神介绍了关于attribute的一个黑魔法,并且我在ibirme大神的源代码里面也看到他用过这个属性,我就系统的学习了一下,记录一下常用的方法。

__attribute__((format()))  

这个format有3个参数。

[objc] view plaincopy
  1. int my(NSString *str,NSString *str1,NSArray*str2,...) __attribute__((format(__NSString__,2,4)));

三个参数告诉编译器,第二个参数必须是NSString类型,且可变参数从第4位开始。

如果你把第二个参数改成别的类型,或者加一个参数,使可变参数变成了第五个,这都是不行的。

__attribute__((nonnull()))  

这个参数可以无数多个

[objc] view plaincopy
  1. int my(NSString *str,NSString *str1,NSArray*str2,...) __attribute__((nonnull(1,3)));

这个的意思是,第一个和第三个参数不能为空。

__attribute__((noreturn))

此方法没有参数,表示这个函数没有返回值也不能有返回值。

__attribute__((const))

这个表示一个方法的返回值只由参数决定,如果参数不变的话,就不再调用此函数,直接返回值。
经过我的尝试发现还是调用了,后又经查资料发现要给gcc加一个-O的参数才可以。是对函数调用的一种优化。

__attribute__((availability))

__attribute__((availability(ios,introduced=2_0,deprecated=7_0)));
表示此函数应用于ios平台,从2.0版本到7.0版本.
这种调用在foundation头文件中经常见到,一些比较著名,存在时间比较长的开源库也有。

__attribute__((unused))

表示函数的返回值必须被检查或使用,否则会警告。

__attribute__((cleanup()))

可以定义一个变量,在他的作用域结束的时候会自动执行一个指定的方法,该方法执行在dealloc之前。

#define onExit\
    __strong void(^block)(void) __attribute__((cleanup(blockCleanUp), unused)) = ^

一个巧妙的用法就是像上面一样定义一个宏,然后

{    onExit {        NSLog(@"yo");
    };
}

在这个onExit中的代码就会在最后执行,这段是在sunnyxx的博客中看到的,应用于reactive cocoa。

__attribute__((always_inline))

这段代码能够保证代码是内联的,因为你如果只定义内联的话,编译器并不一定会以内联的方式调用,如果代码太多你就算用了内联也不一定会内联,用了这个的话会强制内联。
[objc] view plaincopy
  1. static __inline__ __attribute__((always_inline))

将这段代码定义成一个宏,然在函数的前边就能直接强制内联,如果是频繁调用的函数,这样可以提高一定的效率。

在系统的base.h文件中,苹果为很多属性定义了宏,有下面这些

[objc] view plaincopy
  1. #define OS_NORETURN __attribute__((__noreturn__))
  2. #define OS_NOTHROW __attribute__((__nothrow__))
  3. #define OS_NONNULL1 __attribute__((__nonnull__(1)))
  4. #define OS_NONNULL2 __attribute__((__nonnull__(2)))
  5. #define OS_NONNULL3 __attribute__((__nonnull__(3)))
  6. #define OS_NONNULL4 __attribute__((__nonnull__(4)))
  7. #define OS_NONNULL5 __attribute__((__nonnull__(5)))
  8. #define OS_NONNULL6 __attribute__((__nonnull__(6)))
  9. #define OS_NONNULL7 __attribute__((__nonnull__(7)))
  10. #define OS_NONNULL8 __attribute__((__nonnull__(8)))
  11. #define OS_NONNULL9 __attribute__((__nonnull__(9)))
  12. #define OS_NONNULL10 __attribute__((__nonnull__(10)))
  13. #define OS_NONNULL11 __attribute__((__nonnull__(11)))
  14. #define OS_NONNULL12 __attribute__((__nonnull__(12)))
  15. #define OS_NONNULL13 __attribute__((__nonnull__(13)))
  16. #define OS_NONNULL14 __attribute__((__nonnull__(14)))
  17. #define OS_NONNULL15 __attribute__((__nonnull__(15)))
  18. #define OS_NONNULL_ALL __attribute__((__nonnull__))
  19. #define OS_SENTINEL __attribute__((__sentinel__))
  20. #define OS_PURE __attribute__((__pure__))
  21. #define OS_CONST __attribute__((__const__))
  22. #define OS_WARN_RESULT __attribute__((__warn_unused_result__))
  23. #define OS_MALLOC __attribute__((__malloc__))
  24. #define OS_USED __attribute__((__used__))
  25. #define OS_UNUSED __attribute__((__unused__))
  26. #define OS_WEAK __attribute__((__weak__))
  27. #define OS_WEAK_IMPORT __attribute__((__weak_import__))
  28. #define OS_NOINLINE __attribute__((__noinline__))
  29. #define OS_ALWAYS_INLINE __attribute__((__always_inline__))
  30. #define OS_TRANSPARENT_UNION __attribute__((__transparent_union__))
  31. #define OS_ALIGNED(n) __attribute__((__aligned__((n))))
  32. #define OS_FORMAT_PRINTF(x,y) __attribute__((__format__(printf,x,y)))
  33. #define OS_EXPORT extern __attribute__((__visibility__("default")))
  34. #define OS_INLINE static __inline__
  35. #define OS_EXPECT(x, v) __builtin_expect((x), (v))

都是可以直接使用的。

__attribute__函数的作用相关推荐

  1. VC++ inline内联函数的作用解决方案

    VC++ inline内联函数的作用解决方案 __attribute__((always_inline)) attribute((always_inline))的意思是强制内联,所有加了attribu ...

  2. c语言中inline函数的作用

    记录一下inline函数的作用 普通函数的调用过程 在eclipse里面创建工程,代码如下: #include <iostream> #include <vector> #in ...

  3. python函数的作用是_Python函数一

    函数 一.函数的作用 函数就是一段具有独立功能的代码块整合到一个整体并命名,在需要的位置调用这个名称即可完成对应的需求 函数在开发过程中,可以更高效的实现代码重用 二,函数的使用步骤 2.1 定义函数 ...

  4. python中匿名函数的作用_Python 中的匿名函数,你会用吗

    原标题:Python 中的匿名函数,你会用吗 概念 我们从一个例子引入. 这里有一个元素为非空字符串的列表,按字符串最后一个字母将列表进行排序.如果原列表是 ['abc', 'g', 'def'],则 ...

  5. java中的string函数_java中string.trim()函数的作用实例及源码

    trim()的作用:去掉字符串首尾的空格. public static void main(String arg[]){ String a=" hello world "; Str ...

  6. C语言中内联函数的作用 inline

    C语言中内联函数的作用 inline C语言中内联函数到底有什么作用? 试想一下,每当我们在假设就在主函数中调用另外一个函数的时候,那么这个函数就要入栈或者出栈,比如说下面的一个例子: 点击(此处)折 ...

  7. python主函数的作用_python中main函数的用法

    原博文 2020-03-27 20:25 − **什么场景下会有main函数?** 当该python脚本被作为模块(module)引入(import)时,其中的main()函数将不会被执行. **ma ...

  8. 【Android 逆向】ptrace 函数 ( C 标准库 ptrace 函数简介 | ptrace 函数真实作用 )

    文章目录 一.C 标准库 ptrace 函数简介 二.ptrace 函数真实作用 一.C 标准库 ptrace 函数简介 ptrace 函数 : 在 C 标准库 中有一个 ptrace 函数 , 该函 ...

  9. STM32中NVIC_SystemReset()函数的作用?什么时候用?

    STM32中NVIC_SystemReset()函数的作用?什么时候用? STM32软件复位有两种方式 (1)方式一:NVIC_SystemReset()函数用来复位STM32. 注意1:从SYSRE ...

最新文章

  1. SAP启用检查双重Invoice功能
  2. OpenGL ES之GLKit索引绘制“金字塔”及渲染纹理和颜色混合
  3. SqueezeNet网络模型详解
  4. SDNU 1469.校门外的树(水题)
  5. .NET Core使用FluentEmail发送邮件
  6. design php 如何使用ant_Ant Design Pro初探—添加面包屑
  7. android studio moudel,Android Studio将module变为library
  8. 3_03 蛇形填数(数组)
  9. model 创建帖子的方法
  10. linux查找有用日志常用技巧
  11. JAVA程序员面试32问(价值8k)你认同吗?
  12. 今天分享的案例是关于某电商店铺的年终销售业绩
  13. 谷歌金山词霸/搜狗、QQ、google输入法模式分析及展望
  14. 接口测试常用文档模板介绍
  15. 微软搜索战略全盘革新 计划数月内发布“Kiev”
  16. 用简单的c程序编写的扫雷!
  17. DES加密算法的C++实现
  18. alxc tool 报错数组超出了界限_Stack Overflow上59万浏览量的提问:为什么会发生数组越界?
  19. 安装和使用所见即所得WYSIWYG的 Web 创作软件 BlueGriffon
  20. 数字图像隐写术之JPEG 隐写分析

热门文章

  1. 血压测量:很重要的事情!
  2. openAI general intuition
  3. ethz ‘s choice for graduate studies
  4. my understanding for love
  5. apple的photo实际上是一个dashboard
  6. 坐标变换,空间变换的本质
  7. 关于StreamReader的构造函数
  8. 在rancher服务器页面添加Host
  9. 英特尔Optane固态硬盘年内问世 性能暴增
  10. 低水平博士是提升科研生涯的毒药