作家
登录

iOS编译过程的原理和应用

作者: 来源: 2017-04-11 09:44:33 阅读 我要评论

分为三种:

  • 函数属性 (Function Attribute)
  • 类型属性 (Variable Attribute )
  • 变量属性 (Type Attribute )

语法构造

__attribute__ 语法格局为:__attribute__ ((attribute-list))

比如,在三方库中最常见的,声明一个属性或者办法在当前版本弃用了

  1. @property (strong,nonatomic)CLASSNAME * property __deprecated; 

如许的好处是:给开辟者一个过渡的版本,闪开辟者知道这个属性被弃用了,应当应用最新的API,然则被__deprecated的属性仍然可以正常应用。如不雅直接弃用,会导致开辟者在更新Pod的时刻,代码无法运行了。

__attribtue__的应用处景很多,本文只列举iOS开辟中常用的几个:

  1. //弃用API,用作API更新 
  2. #define __deprecated    __attribute__((deprecated)) 
  3.   
  4. //带描述信息的弃用 
  5. #define __deprecated_msg(_msg) __attribute__((deprecated(_msg))) 
  6.   
  7. //碰到__unavailable的变量/办法,编译器直接抛出Error 
  8. #define __unavailable   __attribute__((unavailable)) 
  9.   
  10. //告诉编译器,即使这个变量/办法 没被应用,也不要抛出警告 
  11. #define __unused    __attribute__((unused)) 
  12.   
  13. //和__unused相反 
  14. #define __used      __attribute__((used)) 
  15.   
  16. //如不雅不应用办法的返回值,进行警告 
  17. #define __result_use_check __attribute__((__warn_unused_result__)) 
  18.   
  19. //OC办法在Swift中弗采取 
  20. #define __swift_unavailable(_msg)   __attribute__((__availability__(swift, unavailable, message=_msg)))  

Clang警告处理

你必定还见过如下代码:

这段代码的感化是

  • 对当前编译情况进行压栈
  • 忽视-Wundeclared-selector(未声明的)Selector警告
  • 编译代码
  • 对编译情况进行出栈

经由过程clang diagnostic push/pop,你可以灵活的┞菲握代码块的编译选项。

我在之前的一篇文┞仿里,具体的介绍了XCode的警告相干内容。本文篇幅限制,就不具体讲解了。

  • iOS 合劳顿用Clang警告来进步代码质量

http://blog.csdn.net/Hello_Hwc/article/details/46425503

所谓预处理,就是在编译之前的处理。预处理可以或许让你定义编译器变量,实现前提编译。

比如,如许的代码很常见

  1. #ifdef DEBUG 
  2. //... 
  3. #else 
  4. //... 
  5. #endif  

同样,我们同样也可以定义其他预处理变量,在XCode-选中Target-build settings中,搜刮proprecess。然后点击图中蓝色的加号,可以分别为debug和release两种模式设置预处理宏。

比如我们加上:TestServer,表示在这个宏中的代码运行在测试办事器  

  1. CompileC ClassName.o ClassName.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler 
  2. export LANG=en_US.US-ASCII 
  3. export PATH="..." 
  4. clang -x objective-c -arch x86_64 -fmessage-length=0 -fobjc-arc... -Wno-missing-field-initializers ... -DDEBUG=1 ... -isysroot iPhoneSimulator10.1.sdk -fasm-blocks ... -I 上文提到的文件 -F 所须要的Framework  -iquote 所须要的Framework  ... -c ClassName.c -o ClassName.o 

然后,合营多个Target(右键Target,选择Duplicate),零丁一个Target负责测试办事器。如许我们就不消每次切换测试办事器都要修改代码了。

  1. #ifdef TESTMODE 
  2. //测试办事器相干的代码 
  3. #else 
  4. //临盆办事器相干代码 
  5. #endif  

平日,如不雅你应用CocoaPod来治理三方库,那么你的Build Phase是如许子的:  


  推荐阅读

  在Node.js中看JavaScript的引用

早期进修 Node.js 的时刻 (2011-2012),有挺多是大年夜 PHP 转过来的,当时有部分人对于 Node.js 编辑完代码须要重启一下表示麻烦(PHP不须要这个过程),于是社区里的同伙就开端倡导应用 >>>详细阅读


本文标题:iOS编译过程的原理和应用

地址:http://www.17bianji.com/lsqh/34703.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)