iOS中少量__attribute__运用

作者 : 开心源码 本文共2683个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共199人阅读

Clang Attributes是Clang提供的一种源码注解,方便开发者向编译器表达某种要求,参加控制如Static Analyzer、Name Mangling、Code Generation等过程,一般以attribute(xxx)的形式出现在代码中;为方便使用,少量常用属性也被Cocoa定义成宏,比方在系统头文件中经常出现的NS_CLASS_AVAILABLE_IOS(9_0)就是attribute(availability(…))这个属性的简单写法。

※unavailable
#define UNAVAILABLE_ATTRIBUTE __attribute__((unavailable))

可以加在方法公告的后面,告诉编译器该方法不可用

Swift中

@available(*, unavailable)func foo() {}@available(iOS, unavailable, message="you can't call this")func foo2() {}

※availability

#define NS_DEPRECATED_IOS(_iosIntro,_iosDep,...) CF_DEPRECATED_IOS(_iosIntro,_iosDep,__VA_ARGS__)

开展看

#define CF_DEPRECATED_IOS(_iosIntro, _iosDep, ...) __attribute__((availability(ios,introduced=_iosIntro,deprecated=_iosDep,message="" __VA_ARGS__)))

再开展看

__attribute__((availability(ios,introduced=2_0,deprecated=7_0,message=""__VA_ARGS__)))

iOS即是iOS平台

introduced从哪个版本开始使用

deprecated从哪个版本开始弃用

message警告的信息

其实还可以再加一个参数例子:

void f(void) __attribute__((availability(macosx,introduced=10.4,deprecated=10.6,obsoleted=10.7)));

obsoleted完全禁止使用的版本

NS_AVAILABLE_IOS(7_0) iOS7.0或者之后才能使用

NS_DEPRECATED_IOS(2_0,6_0) iOS2.0开始使用6.0废弃

Swift中:

@available(iOS 6.0, *)public var minimumScaleFactor: CGFloat@available(OSX, introduced=10.4, deprecated=10.6, obsoleted=10.10)@available(iOS, introduced=5.0, deprecated=7.0)func foo3() {}

※objc_subclassing_restricted

一句话就是使用这个属性可以定义一个不可被继承的类

__attribute__((objc_subclassing_restricted))@interface Eunuch : NSObject@end@interface Child : Eunuch//假如继承它会报错@end

在Swift中对原来的很多attribute的支持现在还缺失中,为了达到相似的目的,我们可以使用一个final关键词

final.png

※objc_requires_super

使用这个属性标志子类继承这个方法时需要调用super,否则给出编译警告,来让父类中有少量关键代码是在被继承重写后必需执行

#define NS_REQUIRES_SUPER __attribute__((objc_requires_super))

super.png

在Switf中也还是可以用final的方法来达到这个目的

fatalError.png

Swift equivalent to __attribute((objc_requires_super))?(stackoverflow)

关于Swift中的final的详细讲解

※overloadable

用于C函数,可以定义若干个相同函数名,但参数不同的方法,调用时编译器会自动根据参数选择函数去调用

__attribute__((overloadable))void logAnything(id obj) {NSLog(@"%@", obj);}__attribute__((overloadable)) void logAnything(int number) {NSLog(@"%@", @(number));}__attribute__((overloadable)) void logAnything(CGRect rect) {NSLog(@"%@", NSStringFromCGRect(rect));}// TestslogAnything(@[@"1", @"2"]);logAnything(233);logAnything(CGRectMake(1, 2, 3, 4));

有兴趣的可以写一个自己设置的Log免去用NSLog要写@””等格式的麻烦

※cleanup

__attribute__((cleanup(...))),用于修饰一个变量,在它的作用域结束时可以自动执行一个指定的方法,个人感觉这个真的很方便

cleanUp.png

一个对象可以这样用,那么block实际也是一个对象,这样即可以写一个宏,实际上就是ReactiveCocoa中神奇的@onExit

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

有时候我们需要用到锁这个东西,或者者少量CoreFoundation的对象有时候最后需要释放,用这个宏就很方便了

cleanUp2.png

为了好看用这个宏的时候加个@就加个释放池即可以了

cleanUp3.png

sunnyxx这篇博客讲的很清楚

Swift中:可以用defer

defer.png

还有少量format, const, noreturn, aligned , packed, objc_boxable, constructor / destructor, enable_if, objc_runtime_name可以看这两篇文章:

神奇的attribute

Clang Attributes黑魔法小记

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » iOS中少量__attribute__运用

发表回复