当需要判断iOS系统版本的时候,相信很多人都会这么干:
#define SystemVersion [[UIDevice currentDevice] systemVersion].floatValue
现在告诉屌丝们一个更好的办法就是其实系统已经做了类似的宏定义,不需要我们再去定义了
在Simulator-IOS7.0/usr/include/Availability.h中已经定义了很多系统的宏:
然后使用:
#ifdef __IPHONE_7_0
//iOS7的新特性代码
#endif
或者是使用:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0
//iOS7的新特性代码
#endif(__IPHONE_OS_VERSION_MAX_ALLOWED 这个定义是在Simulator-IOS7.0/usr/include/AvailabilityInternal.h文件中)
就搞定了。
下面是一些常用的宏:
// 是否高清屏
#define isRetina ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)
// 是否模拟器
#define isSimulator (NSNotFound != [[[UIDevice currentDevice] model] rangeOfString:@"Simulator"].location)
// 是否iPad
#define isPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
// 是否iPad
#define someThing (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)? ipad: iphone
宏的基本使用
//定义π值 3.1415926
#define PI 3.1415926
//则在程序用可以如下使用
double i=2*PI*3;
//效果相当于 double i=2*3.1415926*3;
//预处理命令可以定义任何符合格式的形式,例如判断年份是否闰年
#define IS_LEAP_YEAR year%4==0&&year%100!=0||year%400==0
//使用时则可以直接
if(IS_LEAP_YEAR)
//或者可以定义一个参数 1
#define IS_LEAP_YEAR(y) y%4==0&&y%100!=0||y%400==0
//使用时则可以直接
int ys=2012;
if(IS_LEAP_YEAR(ys))
//通常预处理程序定义在一行 如果好分行 比如说太长需要换行 需要使用“/”符号 表示还有下一行,多行分列也是如此,例:
#Define IS_LEAP_YEAR year%4==0&&year%100!=0/
||year%400==0
//宏定义参数后边放一个# 那么在调用该宏时,预处理程序将根据宏参数创建C风格的常量字符串 例: #define STR(x) # x
//将会使得 随后调用的
NSLOG(STR(Programming in Objective-c./n));
//显示结果为 Programming in Objective-c./n
关于#与##的操作符:
<1>.宏定义中字符串化操作符#:
#的功能是将其后面的宏参数进行字符串化操作,意思就是对它所应用的宏变量通过替换后在其左右各加上一个双引号。例如
#define WARN_IF(EXPR)\
do {\
if (EXPR)\
fprintf(stderr, "Warning: " #EXPR "\n");\
} while(0)
上面代码中的反斜线\主要用来转译换行符,即屏蔽换行符。
那么如下的代码调用:
WARN_IF(divider == 0);
将被解析为:
do {\
if (divider == 0)\
fprintf(stderr, "Warning: " "divider == 0" "\n");\
} while(0);
注意能够字符串化操作的必须是宏参数,不是随随便便的某个子串(token)都行的。
<2>.宏定义中的连接符##:
连接符##用来将两个token连接为一个token,但它不可以位于第一个token之前or最后一个token之后。
注意这里连接的对象只要是token就行,而不一定是宏参数,但是##又必须位于宏定义中才有效,因其为编译期概念(比较绕)。
01#define LINK_MULTIPLE(a, b, c, d) a##_##b##_##c##_##d
相关推荐
//-------------------获取设备大小----判断5--------------------- #define IS_IPHONE_FIVE ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640,1136),[[UIScreen...
本文将详细介绍一些常用的iOS宏定义,包括UI元素尺寸、日志输出、系统信息获取等方面。 1. UI元素尺寸宏定义: - `NAVIGATIONBAR_HEIGHT`:定义导航栏的高度,通常为44像素。 - `STATUSBAR_HEIGHT`:定义状态栏的...
在iOS开发中,宏定义(Macros)是一种常用的编程技巧,它可以提高代码的可读性和复用性。本文将对iOS开发中常见的宏定义进行总结,帮助开发者更好地理解和使用它们。 1. 字符串是否为空 `kStringIsEmpty(str)` 这个...
其中,UIFont 类用于设置文字的字体和大小,而 KFacialSizeWidth 和 KFacialSizeHeight 两个宏定义用于设置表情的大小。 在实际应用中,开发者可以使用该机制来实现各种图文混排的功能,例如实现聊天应用程序中的...
2.2.1 Macros(宏)主要存放宏定义的地方,这边有两个宏文件,Macros.h主要是项目的一些主要宏,比如字体、版本、色值等,而ThirdMacros.h主要用于存放一些第三放SDK的key值; 2.2.2 Tool(工具类)主要存放一些常用的...
- 宏定义是预处理器完成的,它会在编译之前替换掉所有宏调用,因此宏定义中的计算是在编译时完成的,而非运行时。 在iOS面试中,这些基础知识的掌握至关重要,因为它们不仅涉及到编程语言的基础,还涉及到内存管理...
在iOS开发中,获取设备信息是常见的需求,主要包括屏幕宽高、设备型号和系统版本信息。这些信息在适配不同设备和系统版本时至关重要。以下是详细的获取方法: 1、获取屏幕的宽高 屏幕的宽高是进行界面布局时的重要...
为了区分iPhone 5和其它设备的屏幕尺寸,可以使用宏定义进行判断。示例代码如下: ```objective-c #define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize...
4. Macro目录:宏定义文件。 5. DB目录:数据库相关文件。 6. Network目录:网络请求相关文件。 7. General目录:通用类文件。 8. Classes目录:自定义View类文件。 9. Views目录:视图控件类文件。 10. ...
- 宏定义:常量宏使用全大写字母和下划线分割,工具宏采用全大写形式。 1.2 类、分类、协议、对象: - 类名:首字母大写,包含名词表示对象类型。建议添加前缀和模块信息以区分命名空间。 - 分类:通过名称理解提供...
在Objective-C中,常量可以使用宏定义(#define)或者枚举(enum)来创建。 **预编译头文件(Prefix Header, .pch)** 预编译头文件在每个目标编译前都会被引入,通常用于包含系统框架、公共头文件和全局常量。这样...
Objective-C中可以使用宏定义、Category或Category中的方法来实现这一目的。 2. **代码混淆**:通过对代码结构进行改造,如嵌套循环、条件判断等,增加理解代码的难度。在Objective-C中,可以利用blocks、Category...
对于程序中经常用到的一些常量或者简短的函数我们通常使用宏定义来处理,这样做的好处是对于程序中所有的配置我们可以统一在宏定义中进行管理,而且由于宏定义是在程序编译之前进行替换相比定义成全局变量或函数效率...
例如,以下宏定义可以用于将64位、32位或16位的数据从一种格式转换为另一种格式: ```c #define BigSwapLittle64(A) ((((uint64)(A)&0xff00000000000000)>>56)|\ (((uint64)(A)&0x00ff000000000000)>>40)|\ ((...
5. **预处理器**:预处理器指令如`#include`用于包含头文件,`#define`用于宏定义,这些在大型项目中用于组织代码和创建代码片段。 6. **输入输出**:C语言通过`stdio.h`库提供的函数如`printf`和`scanf`进行输入...
- **预处理器指令**:解释宏定义和其他预处理器指令的作用。 - **数据类型限定符**:介绍const、volatile等关键字的用途。 2. **面向对象编程基础** - **对象**:讲解面向对象编程的基本概念。 - **消息与方法*...
1. iOS 7是苹果公司在2013年推出的iOS操作系统的第七个主要版本。开发者需要掌握该版本的相关特性来开发兼容的应用。 2. 《iOS 7 Programming Fundamentals》是关于iOS 7的基础编程指南,由作者Matt Neuburg撰写,...
在Objective-C中,可以使用如下的宏定义来检查系统版本: ```objc #define isiOS10 ([[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=10) ``` 这段代码通过获取设备的系统版本字符串并...
这个宏定义了一个布尔变量`isPad`,如果当前设备是iPad,那么`isPad`的值为`YES`;否则,如果设备是iPhone或者未定义,其值为`NO`。 `UIUserInterfaceIdiomPad`是`UIUserInterfaceIdiom`枚举的一个成员,表示iPad...