__attribute__函数的作用

[iOS]__attribute__

标签: iOS
  107人阅读  评论(0)  收藏  举报
  分类:

目录(?)[+]

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

__attribute__((format()))  

这个format有3个参数。

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int my(NSString *str,NSString *str1,NSArray*str2,...) __attribute__((format(__NSString__,2,4)));  

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

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


__attribute__((nonnull()))  

这个参数可以无数多个

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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 plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static __inline__ __attribute__((always_inline))  
将这段代码定义成一个宏,然在函数的前边就能直接强制内联,如果是频繁调用的函数,这样可以提高一定的效率。




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



[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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))  

都是可以直接使用的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值