**
一.debug日志和release日志
**
这里写了两个,
MyLog打印的信息少点,
DLog打印信息很详细
当发布的时候就是release版本,不会打印日志
这些都是定义全局的宏
#ifdef DEBUG // 处于开发阶段
#define MyLog(...) DLog(__VA_ARGS__)
#define DLog(fmt, ...) NSLog((@"[文件名:%s];" "[函数名:%s];" "[行号:%d];" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else // 处于发布阶段
#define MyLog(...)
#define DLog(...)
#endif
**
二.版本兼容
**
新建一个工程,默认的development target,base sdk以及模拟器的版本都是7.0,在AppDelegate中的didFinishLaunchingWithOptions方法里写下
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
self.window.tintColor = [UIColor redColor];
然后运行,这样是没有任何错误的。接下来将development target,base sdk以及模拟器的版本都改成6.1(注意默认的xcode是没有6.1的sdk的,需要自己另外导入)。然后运行,就会报错:
也就是说tintColor属性在iOS6.1中根本就没有,在编译时候就会出错。这时候如下加上判断语句也是没有用的,照样报错(预处理,编译,运行的问题这里不再废话)
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
self.window.tintColor = [UIColor redColor];
}
遇见这种情况只能加上预处理语句,这样写:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
<del>#ifdef __IPHONE_7_0
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
self.window.tintColor = [UIColor redColor];
}
#endif</del>
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
self.window.tintColor = [UIColor redColor];
}
#endif
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
其中__IPHONE_OS_VERSION_MAX_ALLOWED定义在usr/include/AvailabilityInternal.h中
#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
/* make sure a default max version is set */
#ifndef __IPHONE_OS_VERSION_MAX_ALLOWED
#define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_7_0
#endif
/* make sure a valid min is set */
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_2_0
#undef __IPHONE_OS_VERSION_MIN_REQUIRED
#define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_2_0
#endif
#endif
注意需要加入头文件#import
这样编译通过就不会报错了……这是因为在sdk6.1下的usr/include下边有一个Availability.h文件,里边定义了一大堆宏,其中关于iphone的有
#define __IPHONE_2_0 20000
#define __IPHONE_2_1 20100
#define __IPHONE_2_2 20200
#define __IPHONE_3_0 30000
#define __IPHONE_3_1 30100
#define __IPHONE_3_2 30200
#define __IPHONE_4_0 40000
#define __IPHONE_4_1 40100
#define __IPHONE_4_2 40200
#define __IPHONE_4_3 40300
#define __IPHONE_5_0 50000
#define __IPHONE_5_1 50100
#define __IPHONE_6_0 60000
#define __IPHONE_6_1 60100
#define __IPHONE_NA 99999 /* not available */
而sdk7.0里边多了一行
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
#define __IPHONE_7_0 70000
iOS8当然也是一样的道理
除此之外,当使用framework或者.a的时候需要注意
因为在编译framework或者.a的时候是依赖当时编译的环境决定的,如使用iOS6的sdk可以将framework或者.a顺利编译通过,但是在真正生成app的时候需要保证编译app时的sdk和编译framework或者.a的sdk是一致的,且同时需要加入运行时判断([[[UIDevice currentDevice] systemVersion] floatValue]那个)
说明:
1、如果是使用低版本sdk编译的(如iOS9),将最终的应用安装至高版本的设备上(iOS10的系统),此时应该不会出现问题,因为iOS7兼容iOS9,但是无法使用iOS10特有的新功能,因为代码被屏蔽了。
2、如果是使用高版本sdk编译的(如iOS10),将最终的应用安装至低版本的设备上(iOS9的系统),此时如果不加入运行时判断就会出现问题(可能是crash)。因为应用本身是用iOS10编译的,并使用iOS10才有的新功能,而设备并不支持iOS10。