OC中的宏定义
我们都知道,宏定义是编译期常量。而OC是一种动态语言。
1.iOS系统版本判断的两个宏定义
__IPHONE_OS_VERSION_MAX_ALLOWED // iOS系统版本最大允许
__IPHONE_OS_VERSION_MIN_REQUIRED // iOS系统版本最小需要
使用这俩宏,仅仅能消除编译器的警告而已。因为OC是动态语言,所以系统版本还需要判断。例如:

2.断言
/**
@brief 适用:Objective-C的方法
@param condition 条件.
@param desc 描述.
@return 若条件为NO,则工程崩溃且打印 desc.
*/
NSAssert(<#condition#>, <#desc, ...#>) /**
适用:C的函数
*/
NSCAssert(<#condition#>, <#desc, ...#>) /**
@brief 适用:Objective-C
@param condition 条件.
@return 若条件为NO,则工程崩溃.
*/
NSParameterAssert(<#condition#>) /**
适用:C
*/
NSCParameterAssert(<#condition#>)
NSAssert 用法:
Man *man = nil;
NSAssert(man, @"man Can't be empty.");
崩溃日志:
-- ::49.505 OC测试[:] *** Assertion failure in -[ViewController viewDidLoad], /Users/liuxianzhi/Desktop/OC测试/OC测试/ViewController.m:
-- ::49.515 OC测试[:] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'man Can't be empty.'
NSParameterAssert用法:
#pragma mark - View lifeCycle
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor orangeColor]; [self executeWithParam:nil];
} - (void)executeWithParam:(NSString *)param {
// param存在,程序继续;反之崩溃!
NSParameterAssert(param);
}
崩溃日志:
-- ::10.155 OC测试[:] *** Assertion failure in -[ViewController executeWithParam:], /Users/liuxianzhi/Desktop/OC测试/OC测试/ViewController.m:
-- ::10.164 OC测试[:] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: param'
尊重作者劳动成果,转载请注明: 【kingdev】
OC中的宏定义的更多相关文章
- 创建工程常量 (OC中的宏定义)
1.oc创建宏 文件 2.swift创建 常量文件 在swift中, 并非是预编译代码替换, 而是设置全局常量, 简单宏, 直接let 加常量名即可
- iOS 静态库中使用宏定义区分iPhone模拟器与真机---备用
问题描述 一般项目中,可以使用宏定义来判断模拟器还是真机,这无疑是有效的. #if TARGET_IPHONE_SIMULATOR #define SIMULATOR 1 #elif TARGET_O ...
- C++中的内联函数和C中的宏定义的区别
在C++中内联函数: 内联函数即是在函数的声明和和定义前面加上“inline”关键字,内联函数和常规函数一样,都是按照值来传递参数的,如果参数为表达式,如4.5+7.5,则函数将传递表达式的值(这里为 ...
- Makefile中进行宏定义-***
实际上是gcc命令支持-D宏定义,相当于C中的全局#define: gcc -D name gcc -D name=definition Makefile中可以定义变量(和宏很像),但是是给make解 ...
- C语言学习笔记--C语言中的宏定义
1. C 语言中的宏定义 (1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)(3)#d ...
- Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D【转】
本文转载自:http://blog.csdn.net/maopig/article/details/7230311 在源代码里面如果这样是定义的:#ifdef MACRONAME//可选代码#en ...
- 内核中的宏定义__init、__initdata和__exit、__exitdata
__init.__initdata和__exit.__exitdata的定义位于<kernel/include/linux/init.h> /* These are for everybo ...
- [C++] C++中的宏定义详解
转载自:C++中的宏定义 和 C++宏定义详解 一.#define解析 #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率 ...
- 20个C语言中常用宏定义总结
01: 防止一个头文件被重复包含 #ifndef COMDEF_H#define COMDEF_H//头文件内容#endif 02: 重新定义一些类型防止由于各种平台和编译器的不同,而产生的类型字节数 ...
随机推荐
- Ajax遇到的那些坑
提前说明:这里我用的是Windows系统,所以解决问题的方法也是仅限Windows系统,浏览器使用Chrome 第一个坑:Access to XMLHttpRequest at 'file:///C: ...
- jsp网站访问次数统计
JSP 点击量统计 有时候我们需要知道某个页面被访问的次数,这时我们就需要在页面上添加页面统计器,页面访问的统计一般在用户第一次载入时累加该页面的访问数上. 要实现一个计数器,您可以利用应用程序隐式对 ...
- TensorFlow高层封装:从入门到喷这本书
目录 TensorFlow高层封装:从入门到喷这本书 0. 写在前面 1. TensorFlow高层封装总览 2. Keras介绍 2.1 Keras基本用法 2.2 Keras高级用法 3. Est ...
- Jmeter (二十六)逻辑控制器 之 Module Controller and Include Controller
Module Controller ---模块控制器 测试计划设置“独立运行没每个线程组” 线程组2中使用Module Controller执行线程组1中的Sampler: 紧接着,将线程组1disa ...
- BZOJ 1123 && Luogu P3469 [POI2008]BLO-Blockade 割点+乘法原理
想了半天式子...最后在邓大师的帮助下想出此题....QWQ我还是太菜了 对于一个非割点,ans+=2*(n-1); 对于一个割点,ans+= #include<cstdio> #incl ...
- (转)CentOS之7与6的区别
CentOS之7与6的区别 原文:http://www.cnblogs.com/Csir/p/6746667.html http://blog.csdn.net/u012562943/article/ ...
- ef 操作 mysql 中文乱码问题
1.保证mysql数据的编码为utf8 启动mysql mysql -hlocalhost -uroot -p 输入密码 show VARIABLES like 'character_%'; SET ...
- jvm 内存dump、gc查看、线程死锁,jmap、jstack、jstat
1. jstat 这个命令对于查看Jvm的堆栈信息很有用.能够查看eden,survivor,old,perm等heap的capacity,utility信息 对于查看系统是不是有能存泄漏以及 ...
- 【踩坑】springMVC 接收String参数没有判断为空
今天在调试iReview项目的接口时,发现新增词条和新增库的时候,某些字段即使留空POST到后台时也能当做不为空. 经过排查,发现后台是使用 String 变量名 == null 这样的语句去判断变量 ...
- text-transform 字母的大小写
text-transform: none 默认 capitalize 每个单词以大写字母开头 uppercase 仅有大写字母 lowercase 无大写字母,仅有小写字母 i ...