[iOS]__attribute__
来源:互联网 发布:微信红包开发源码 编辑:程序博客网 时间:2024/06/02 19:41
今天看博客看到了sunnyxx大神介绍了关于attribute的一个黑魔法,并且我在ibirme大神的源代码里面也看到他用过这个属性,我就系统的学习了一下,记录一下常用的方法。
__attribute__((format()))
这个format有3个参数。
int my(NSString *str,NSString *str1,NSArray*str2,...) __attribute__((format(__NSString__,2,4)));
三个参数告诉编译器,第二个参数必须是NSString类型,且可变参数从第4位开始。
如果你把第二个参数改成别的类型,或者加一个参数,使可变参数变成了第五个,这都是不行的。
__attribute__((nonnull()))
这个参数可以无数多个
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))
这段代码能够保证代码是内联的,因为你如果只定义内联的话,编译器并不一定会以内联的方式调用,如果代码太多你就算用了内联也不一定会内联,用了这个的话会强制内联。
static __inline__ __attribute__((always_inline))将这段代码定义成一个宏,然在函数的前边就能直接强制内联,如果是频繁调用的函数,这样可以提高一定的效率。
在系统的base.h文件中,苹果为很多属性定义了宏,有下面这些
#define OS_NORETURN __attribute__((__noreturn__))#define OS_NOTHROW __attribute__((__nothrow__))#define OS_NONNULL1 __attribute__((__nonnull__(1)))#define OS_NONNULL2 __attribute__((__nonnull__(2)))#define OS_NONNULL3 __attribute__((__nonnull__(3)))#define OS_NONNULL4 __attribute__((__nonnull__(4)))#define OS_NONNULL5 __attribute__((__nonnull__(5)))#define OS_NONNULL6 __attribute__((__nonnull__(6)))#define OS_NONNULL7 __attribute__((__nonnull__(7)))#define OS_NONNULL8 __attribute__((__nonnull__(8)))#define OS_NONNULL9 __attribute__((__nonnull__(9)))#define OS_NONNULL10 __attribute__((__nonnull__(10)))#define OS_NONNULL11 __attribute__((__nonnull__(11)))#define OS_NONNULL12 __attribute__((__nonnull__(12)))#define OS_NONNULL13 __attribute__((__nonnull__(13)))#define OS_NONNULL14 __attribute__((__nonnull__(14)))#define OS_NONNULL15 __attribute__((__nonnull__(15)))#define OS_NONNULL_ALL __attribute__((__nonnull__))#define OS_SENTINEL __attribute__((__sentinel__))#define OS_PURE __attribute__((__pure__))#define OS_CONST __attribute__((__const__))#define OS_WARN_RESULT __attribute__((__warn_unused_result__))#define OS_MALLOC __attribute__((__malloc__))#define OS_USED __attribute__((__used__))#define OS_UNUSED __attribute__((__unused__))#define OS_WEAK __attribute__((__weak__))#define OS_WEAK_IMPORT __attribute__((__weak_import__))#define OS_NOINLINE __attribute__((__noinline__))#define OS_ALWAYS_INLINE __attribute__((__always_inline__))#define OS_TRANSPARENT_UNION __attribute__((__transparent_union__))#define OS_ALIGNED(n) __attribute__((__aligned__((n))))#define OS_FORMAT_PRINTF(x,y) __attribute__((__format__(printf,x,y)))#define OS_EXPORT extern __attribute__((__visibility__("default")))#define OS_INLINE static __inline__#define OS_EXPECT(x, v) __builtin_expect((x), (v))
都是可以直接使用的。
1 0
- [iOS]__attribute__
- iOS宏和__attribute__
- iOS宏和__attribute__
- iOS __attribute__ 总结
- __attribute__ 和IOS有关系
- IOS __attribute__ ((warn_unused_result))的含义
- iOS 黑魔法 __attribute__(转摘)
- IOS __attribute__ ((warn_unused_result))的含义
- iOS中__attribute__的使用
- __attribute__
- __attribute__
- __attribute__
- __attribute__
- __attribute__
- __attribute__
- __attribute__
- __attribute__
- __attribute__
- android项目源码解析04:新浪微博客户端源码解析
- 简述div元素和span元素的区别?
- 遗传算法
- ant 使用指南
- 关于QT的系统总结
- [iOS]__attribute__
- Android Studio Gradle DSL method not found: 'android()' — Error(17,0)
- 蓝牙数据 传来数据值处理
- 分组查询显示每一组的第一条
- RDA8826 bug修复记录
- 在mac上创建鼠标双击可执行的shell脚本
- PHP简单AJAX
- 五十道编程小题目 --- 29 java
- php下zmq扩展安装