#ifndef _TEST_H
#define _TEST_H//一般是文件名的大写
头文件结尾写上一行:
#endif
这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。
分析:当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H和#endif之间的代码,当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef _TEST_H和#endif之间的代码也就不会再次被包含,这样就避免了重定义了。
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。
#ifndef 标识符
程序段1
#else
程序段2
#endif
它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的作用相反。
一般情况下,我们使用#define来定义一个常量,#define的本质是文本替换.
1、定义常量
定义常量的时候最好以小写字母k开头,让人见名知意 例如:
#define kSCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define kSCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
2.定义比NSLog更高级的DLog
#define DEBUG_MODE 1
#if DEBUG_MODE
#define DLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DLog( s, ... )
#endif
当我们在Debug项目的时候,会产生这些输出;我们发布(release)项目的时候,将#define DEBUG_MODE 1注释掉,这时候就不会产生输出了,毕竟输出也是要耗费CPU资源,降低APP运行效率,虽然影响微乎其微,但是程序员做事就是要精细嘛。这种手动配置项目的方法,熟练是用可以极大地提高开发效率。
3.定义GCD的后台线程和主线程
//后台运行
#define BACK_GCD(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)
//主线程运行
#define MAIN_GCD(block) dispatch_async(dispatch_get_main_queue(),block)
一个是使用dispatch_time()来创建延迟时间,另一个是使用dispatch_walltime()来创建时间。前者是取的是当前设备的时间,后者去的是挂钟的时间,也就是绝对时间,如果设备休眠了那么前者也就休眠了,而后者是是根据挂钟时间不会有当前设备的状态而左右的。下面在创建dispatch_time_t对象的时候,有一个参数是NSEC_PER_SEC,从命名只能怪我们就可以知道NSEC_PER_SEC表示什么意思,就是每秒包含多少纳秒。你可以将该值进行打印,发现NSEC_PER_SEC = 1_000_000_000。也就是一秒等于10亿纳秒。如果下方的time不乘于NSEC_PER_SEC那么就代表1纳秒的时间,也就是说此处的时间是按纳秒(nanosecond)来计算的。下方就是延迟执行的的代码,因为改代码输出结果比较简单,在此就不做过多的赘述了。需要注意的是延迟执行会在新开辟的队列中进行执行,不会阻塞新的线程。
/**
Returns a dispatch_time delay from now.
*/
static inline dispatch_time_t dispatch_time_delay(NSTimeInterval second) {
return dispatch_time(DISPATCH_TIME_NOW, (int64_t)(second * NSEC_PER_SEC));
}
/**
Returns a dispatch_wall_time delay from now.
*/
static inline dispatch_time_t dispatch_walltime_delay(NSTimeInterval second) {
return dispatch_walltime(DISPATCH_TIME_NOW, (int64_t)(second * NSEC_PER_SEC));
}
网友评论