iOS - 《系统宏》宏,预处理命令

在ios中使用预处理命令[C语言的特殊命令]

1.宏定义

#define 与 #undef

#define ** —>表示进行宏**定义
#undef **->表示结束**宏定义

2.带参数宏定义

格式: #define 宏名称(参数1,参数2…) 操作字符串
\#define add(a,b,c) a+b+c; 
note:建议将宏定义中的参数用括号括起来,假如宏定义返回一个数值型,建议用括号括起来,eg,
(错误)#define GIRTH(r) 3.14*2*r ,调用时:GIRTH(10+2) —>3.14*2*10+2,这结果明显不对;
(正确)#define GIRTH(r) (3.14*2*(r) ),调用时:GIRTH(10+2) —>3.14*2*(10+2),这结果正确;

3.使用执行条件宏,利用宏进行选择性编译

#ifdef ,#ifndef, #if , #elif, #else ,#endif
格式:
#ifdef 宏名称 (表示如果存在宏***,就会执行该部分代码)
//任意语句
#endif

#if 表达式
    //任意语句
#elif 表达式
    //任意语句
#else 
    //任意语句
#endif

4.引入文件,#include 与 #import

#include指定源代码插入到当前源码的指定位置
#import 更加智能,可以避免重复导入文件

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

系统宏NS_ASSUME_NONNULL_BEGIN & NS_ASSUME_NONNULL_END

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

两个宏:NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END。在这两个宏之间的代码,所有简单指针对象都被假定为nonnull,因此我们只需要去指定那些nullable的指针。
Swift中存在Option类型,也就是使用声明的变量。但是OC里面没有这个特征,因为在XCODE6.3之后出现新的关键词定义用于OCSWIFT时候可以区分到底是什么类型.

__nullable && ___nonnull
__nullable指代对象可以为NULL或者为NIL
__nonnull指代对象不能为null
当我们不遵循这一规则时,编译器就会给出警告。

屏幕快照 2017-12-19 11.04.52.png

/
/
/
/
/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

系统宏:NS_UNAVAILABLE/NS_DESIGNATED_INITIALIZER

NS_UNAVAILABLE:禁止原来的初始化构造方法;
NS_DESIGNATED_INITIALIZER:重新指定构造方法;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Objective-C 中主要通过NS_DESIGNATED_INITIALIZER宏来实现指定构造器的。这里之所以要用这个宏,往往是想告诉调用者要用这个方法去初始化(构造)类对象。通过NS_UNAVAILABLE宏进行消除警告

如下图所示:
重新指定初始化构造器

屏幕快照 2017-12-19 11.09.58.png

出现编译警告
屏幕快照 2017-12-19 11.10.35.png

处理方法:通过使用NS_UNAVAILABLE禁止原来的 与NS_DESIGNATED_INITIALIZER指定新的

屏幕快照 2017-12-19 11.18.34.png

这时外部调用init会报错,因为init已经被禁止了
屏幕快照 2017-12-19 11.18.52.png

/
/
/
/
/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

系统宏: DEPRECATED_ATTRIBUTE

标识过期方法函数.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

用来标识过期方法API的

- (void)method1:( NSString *)string __attribute__((deprecated("使用#method2")));
- (void)method12 DEPRECATED_ATTRIBUTE; //DEPRECATED_ATTRIBUTE是系统的宏

推荐阅读更多精彩内容

  • 当面对多个初始化方法时,外部调用者往往会手足无措,不知道哪一个才是正确的初始化方法,对此,苹果提供了两个关键字: ...
    蓑衣微凉阅读 9,788评论 1 36
  • 01-禅与 Objective-C 编程艺术之条件语句与命名 类 类名 类名应该以三个大写字母作为前缀(双字母前缀...
    7分醉阅读 249评论 0 1
  • 忽然看到仙剑七立项,心里非常忐忑。一方面,虚幻4引擎的使用肯定会让游戏体验加分,另一方面,对于仙剑七的世界设定,却...
    清净墨莲阅读 106评论 0 0
  • 走不尽的山峦和起伏,河流和草原, 数不尽的密密的村庄,鸡鸣和狗吠, 接连在原是荒凉的亚洲的土地上, 在野草的茫茫中...
    泰君工坊阅读 121评论 0 0