在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_BEGIN, NS_ASSUME_NONNULL_END。在这两个宏之间的代码,所有简单指针对象都被假定为nonnull,因此我们只需要去指定那些nullable的指针。
在Swift中存在Option类型,也就是使用?和!声明的变量。但是OC里面没有这个特征,因为在XCODE6.3之后出现新的关键词定义用于OC转SWIFT时候可以区分到底是什么类型.
屏幕快照 2017-12-19 11.04.52.png__nullable && ___nonnull
__nullable指代对象可以为NULL或者为NIL
__nonnull指代对象不能为null
当我们不遵循这一规则时,编译器就会给出警告。
/
/
/
/
/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
系统宏: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是系统的宏
网友评论