项目开发中的一些琐碎知识点汇总

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文件需要提前编译,比较耗费时间. 当然如果你还想继续使用的话,需要手动创建并配置。

使用注意点:

  1. pch需要提前编译
  2. 需要做一些判断,判断下当前有没有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];

打印结果:


项目开发中的一些琐碎知识点汇总_第1张图片

单利模式

单例模式的作用 :可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。

利用GCD实现单利模式

//.h文件
#import 
@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

你可能感兴趣的:(项目开发中的一些琐碎知识点汇总)