1、多用块枚举,少用for循环
NSArray *array ;
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
//obj是当前对象,idx是针对的下标,以及指向布尔值的指针,第三个参数开发者可以终止遍历操作
*stop = NO;//终止操作
}];
NSSet *set;
[set enumerateObjectsUsingBlock:^(id _Nonnull obj, BOOL * _Nonnull stop) {
//可以遍历set
}];
NSDictionary *dic;
[dic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
//key是键,obj是值,这样做可以一下子得到键和值
}];
其中obj类型可以修改成指定的类型
2、构建缓存时选用NSCache而非NSDictionary
NSCache好处就是当系统内存警告时候,NSCache会自动删减缓存,还会先行删减久未使用的对象,,NSCache是线程安全的,并且他不拷贝键,而只是保留它
NSData *data;
NSCache *cache = [NSCache new];
cache.countLimit = 100;//最大缓存对象数目
cache.totalCostLimit = 5*1024*1024;//总开销上线5M,
[cache setObject:data forKey:@"cache" cost:data.length];
将NSPurgeableData和NSCache搭配使用;
NSPurgeableData *purgeData = [cache objectForKey:@"cache"];
if (purgeData) {
[purgeData beginContentAccess];
//使用purgeData的代码
[purgeData endContentAccess];
}else{
NSData *data;
purgeData = [NSPurgeableData dataWithData:data];
[cache setObject:purgeData forKey:@"cache"];
//使用purgeData的代码
[purgeData endContentAccess];
}
创建了NSPurgeableData对象后,其“purage引用计数”会自动多1,无需再次调用beginContentAccess,但是最后必须调用endContentAccess
3、精简initialize和load的实现代码
+(void)load
对于加入运行期系统的每个类以及分类来说,必定会调用此方法,而且仅调用一次。当包含类或分类的程序库载入系统时,就会执行此方法。如果类和分类都定义了load方法,则先调用类的,在调用分类里的。
load方法问题在于,执行load方法时候其他类的所有超类的load方法未必执行完,如果代码还依赖其他程序库,那么在执行该类的load方法时候无法判断依赖库的load方法是否执行完,所以在load 方法中使用其他类是不安全的。
load方法不遵循继承,load方法务必实现的精简一些,因为整个应用程序在执行load方法时候会阻塞。特别是加锁任务,总之,凡是想通过load方法在类加载之前执行某些任务的,基本都不行。
initialize
这个方法会在程序首次用到该类之前调用,且只调用一次。不能通过代码调用,只能通过系统调用。有个注意点就是,如果某个类未实现该方法,但是他父类实现了,那么该类和他的父类都会执行该方法。
initialize方法只应该用来设置内部数据,不应该在其中调用其他方法,即便是本类自己的方法,也最好别调用。
无法在编译期设定的全局常量,可以放在initialize里面初始化。