1. 判断当前环境是ARC还是MRC
#if __has_feature(objc_arc)
// 当前的编译器环境是ARC
#else
// 当前的编译器环境是MRC
#endif
2. 读取info.plist文件中的数据
方式一
// File:获取文件的全路径 => 文件在哪(主bundle)
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Info.plist" ofType:nil];
// 1.解析info,plist
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
// 获取当前的版本号
NSString *Verision = dict[@"CFBundleShortVersionString"];
上述的方式比较麻烦,系统自已为我们提供了一个方法:
// 第二种方式获取info.plist信息
NSString * Verision = [NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"];
3. PCH文件
PCH文件(Precompile Prefix Header File),也就是预编译头文件,其作用就是,方便你一次性导入在多个文件中同时用到的头文件、宏或者URL地址等(全局使用),可以有效的帮你节约时间,提高开发效率。但是,自从Xcode 6之后,这个文件默认就不再提供了,因为PCH文件需要提前编译,比较耗费时间. 当然如果你还想继续使用的话,需要手动创建并配置。
使用注意点:
- pch需要提前编译
- 需要做一些判断,判断下当前有没有c文件,如果有c,就不导入OC的语法
//判断是否是OC环境
#ifdef __OBJC__
// 1.存放一些公用的宏
#define Height (10)
// 2.存放一些公用的头文件
#import "UIImage+Image.h"
// 3.自定义Log(输出日志) 因为NSLog是非常耗费性能的
#ifdef DEBUG // 调试
#define XMGLog(...) NSLog(__VA_ARGS__)
#else // 发布
#define XMGLog(...)
#endif
#endif
4. 遍历打印所有子视图
// 获取子视图
- (void)getSub:(UIView *)view andLevel:(int)level {
NSArray *subviews = [view subviews];
if ([subviews count] == 0) return;
for (UIView *subview in subviews) {
NSString *blank = @"";
for (int i = 1; i < level; i++) {
blank = [NSString stringWithFormat:@" %@", blank];
}
NSLog(@"%@%d: %@", blank, level, subview.class);
[self getSub:subview andLevel:(level+1)];
}
}
比如我们想获取self.navigationController.navigationBar
的子视图结构我们可以
[self getSub:self.navigationController.navigationBar andLevel:1];
打印结果:
单利模式
单例模式的作用 :可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。
利用GCD实现单利模式
//.h文件
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
//单例方法
+(instancetype)sharedSingleton;
@end
//.m文件
#import "Singleton.h"
@implementation Singleton
//全局变量
static id _instance = nil;
//类方法,返回一个单例对象
+(instancetype)sharedSingleton{
return [[self alloc] init];
}
//alloc内部其实就是用allocWithZone:
+(instancetype)allocWithZone:(struct _NSZone *)zone{
//只进行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
//初始化方法
- (instancetype)init{
// 只进行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super init];
});
return _instance;
}
//copy在底层 会调用copyWithZone:
- (id)copyWithZone:(NSZone *)zone{
return _instance;
}
+ (id)copyWithZone:(struct _NSZone *)zone{
return _instance;
}
+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone{
return _instance;
}
@end