扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
有。
网站的建设创新互联建站专注网站定制,经验丰富,不做模板,主营网站定制开发.小程序定制开发,H5页面制作!给你焕然一新的设计体验!已为活动板房等企业提供专业服务。
标准中一些预定义的宏
C标准中指定了一些预定义的宏,对于编程经常会用到。下面这个表中就是一些常常用到的预定义宏。
宏
意义
__DATE__
进行预处理的日期(“Mmm dd yyyy”形式的字符串文字)
__FILE__
代表当前源代码文件名的字符串文字
__LINE__
代表当前源代码中的行号的整数常量
__TIME__
源文件编译时间,格式微“hh:mm:ss”
__func__
当前所在函数名
系统宏汇集
__FILE__
当前文件所在目录
__DATE__
“替代文字”是一个含有编译日期的字符串字面值,日期格式为“mm dd yyyy”(例如:“Mar 19 2006”)。如果日期小于10日,就在日的前面放一个空格符。NSLog(@"_DATE_=%s",__DATE__);
__FUNCTION__
当前函数名称
__LINE__
当前语句在源文件中的行数
__TIME__
此字符串字面值包含编译时间,格式为“hh:mm:ss”(范例:“08:00:59”)。
__STDC__
整数常量1,表示此编译器遵循ISOC标准。
__STDC_VERSION__
如何实现复合C89整部1,则这个宏的值为19940SL;如果实现符合C99,则这个宏的值为199901L;否则数值是未定义
__STDC_EOBTED__
(C99)实现为宿主实现时为1,实现为独立实现为0
__STDC_IEC_559__
(C99)浮点数实现复合IBC 60559标准时定义为1,否者数值是未定义
__STDC_IEC_559_COMPLEX__
(C99)复数运算实现复合IBC 60559标准时定义为1,否者数值是未定义
__STDC_ISO_10646__
(C99)定义为长整型常量,yyyymmL表示wchar_t值复合ISO 10646标准及其指定年月的修订补充,否则数值未定义
Category/Util
sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错~
BlocksKit 将Block风格带入UIKit和Founcation
cocoa-helpers 一些Cocoa的扩展 2年前的工程
CoconutKit 一系列扩展和一些自定组件
STUtils 一系列扩展包
PSFoundation 一系列扩展 和功能增强
ConciseKit 一系列宏定义 挺有意思
DTFoundation 又一系列扩展。。。
BBBootstrap 一些常见功能的扩展库
cooliris-toolkit cooliris出品的基础工具库,从GoogleCode clone过来
BaseKit 一套基础工具库
NSObject-Utility-Categories 如题
NSArray-Utilities 如题
aqtoolkit 一些常用的东西
DLIntrospection 一些NSObject的扩展
NSDate-Extensions 如题日期
ALActionBlocks 在UIControl上添加的Block事件
jrswizzle 主要是swizzling
moriarty 一些还算有用的功能
QSUtilities 一些基础库 (Instagram有用到)
libextobjc 一堆oc的扩展
PrettyTimestamp 友好时间的扩展
ios-jail-break-detector 检测是否越狱 有上线
crackify 检测App是否被破解
NSBundle-OBCodeSigningInfo 检查当前签名、Sandbox状态 MacOSX
UIView-AnimatedProperty 为UIView添加动画效果的property,有用到swizzle
Block-KVO Block风格的KVO~
MTDates 一些Data的category
CocoaSecurity 常见的哈希、加密解密算法
sskeychain 访问keychain 支持iOS Mac
ABContactHelper 访问联系人
UISS 用JSON的风格设置UIKit样式
Underscore.m 仿JS的underscore.js来写的,用于访问和处理数据
TICoreDataSync 在不同设备间对CoreData进行同步 (iPhone iPad Mac)
SoloComponents-iOS 几个轻量的组件,没什么用,2年没更新
MAObjCRuntime 将运行时包装成ObjC
Objective-C-Generics 通过宏定义勉强实现的范型
TBMacros 一些常用的宏定义
NSString-Ruby 为Ruby程序员带来的字符串相关功能
ObjectiveRecord CoreData包装的活动记录 有RoR风格的API
FastImageCache 滑动时快速显示图片的库,Path开发
在了解宏定义的使用前,需要说明一下合理使用宏定义确实可以提高程序的可读性,但是滥用宏定义,也会带来一些害处。这里对宏定义使用的优缺点做个简单的说明:
宏可以分为两类,一类称为对象宏,一类称为函数宏
对象宏可以定义一个量,如圆周率:
通过宏可以拿到这个变量:
打印结果:
但是看一下另外一种情况:
结果如下:
为什么*2的结果不是140,是110呢?
因为前面提到过了,宏只是简单地替换,所以 2的时候,实际是30+40 2
函数宏的作用就类似于一个函数一样。如:
其结果如下:
再来看另外一个例子:
这里需要注意一个问题,如果宏太长,可以使用"/"进行换行
这样便是大大增加了可读性
在OC中使用字符串都需要使用@"",如果想直接使用字符串可以添加一个"#":
再看一个关于##的操作符,连接符##用来将两个token连接为一个token:
提到可变参数宏,其实能够想到的,最多的便是NSLog。可变参数,可以利用 VA__ARGS进行读取:
打印结果如下:
前言
Enum,也就是枚举,从C语言开始就有了,C++、Java、Objective-C、Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个—规范的定义代码中的状态、选项等“常量”。
举个例子,我们想要在开发中根据四季的变化做不同的操作,我们首先想到的可能会是定义一个int型变量,通过为该变量赋不同的`值来表示四季(e.g. 1为春天,2为夏天,3为秋天,4为冬天).但是,对于阅读该份代码的人来讲,他们并不能在短时间内就明白数字1234所代表的具体含义.这个时候,选择使用枚举则可以应对该需求
C语言中的枚举
在C语言中定义枚举类型的方式如下
enum 枚举名称{ 标识符 = 整型常量, 标识符 = 整型常量, 标识符 = 整型常量, 标识符 = 整型常量};
以"定义一个枚举名称为Test,拥有TestA、TestB等枚举成员的枚举类型"为例,定义方式如下
enum Test{ TestA = 0, TestB = 1, TestC = 2, TestD = 3};
注1: 当枚举成员都未设置"=整型常量"时,默认从第一个标识符开始,从0依次递增加1
注2: 当为某个枚举成员设置"=整型常量"时,其后面的标识符会在此基础上依次递增加1
在使用该枚举类型时,我们需要创建一个枚举变量
enum 枚举名称 枚举变量 = 枚举变量值;
以"创建一个枚举名称为Test的枚举变量test,并为其赋值TestB"为例
enum Test test = TestB;
注: 枚举变量值的取值只能从对应枚举类型的枚举成员中选择
我们也可以在定义枚举类型的同时定义枚举变量,该枚举变量不用初始化,可直接对其进行赋值并使用
enum Test{ TestA = 0, TestB, TestC, TestD} test;
注: 该枚举名称可以省略,直接定义枚举变量即可(称作"匿名枚举")
通过typedef为枚举类型设置一个"别名",这样便可以像使用int一样使用枚举类型
typedef enum _Test{ TestA = 0, TestB, TestC, TestD} Test;
定义"别名"后,便可采用如下方式定义枚举变量
Test test = TestB;
针对匿名枚举,在通过typedef设置"别名"便变成如下形式
typedef enum{ TestA = 0, TestB, TestC, TestD} Test;
定义"别名"后,便可采用如下方式定义枚举变量
Test test = TestB;
OC语言中的枚举
在Objective-C语言中,Apple在iOS6中引入了两个宏来重新定义枚举类型(即:NS_ENUM与NS_OPTIONS),这两者在本质上并没有差别,都是用于定义枚举类型,但是在使用中NS_ENUM多用于一般枚举,而NS_OPTIONS则多用于带有移位运算的枚举
NS_ENUM使用示例
typedef NS_ENUM(NSInteger, Test){ TestA = 0, TestB, TestC, TestD};
NS_OPTIONS使用示例
typedef NS_OPTIONS(NSUInteger, Test) { TestA = 1 0, TestB = 1 1, TestC = 1 2, TestD = 1 3};
typedef NS_OPTIONS(NSUInteger, Test) { TestNone = 0, TestA = 1 0, TestB = 1 1, TestC = 1 2, TestD = 1 3};
带有移位运算的枚举多用于同一个枚举变量可以同时赋值多个枚举成员的情况,其原理就是将各个枚举值按位或(|),因为移位运算的枚举成员可以保证按位或(|)计算之后结果的唯一性,所以每种结果都能反向计算出是由哪几个枚举成员按位或(|)而成
以"使用按位或(|)为枚举变量test同时赋值枚举成员TestA、TestB与TestC"为例
Test test = TestA | TestB;test |= TestC;
以"使用按位异或(^)为枚举变量test去掉一个枚举成员TestC"为例
Test test = TestA | TestB | TestC;test ^= TestC;
注: 如果枚举变量test本身并未赋值TestC,那么使用按位异或(^)会为枚举变量test多赋值一个枚举成员TestC
以"使用按位与()判断枚举变量test是否赋值了枚举成员TestA"为例
Test test = TestA | TestB;if (test TestA){ NSLog(@"yes");}else{ NSLog(@"no");}
总结
以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流