系统框架,编程规范

2017-05-19  本文已影响9人  海浪萌物

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里面初始化。

上一篇下一篇

猜你喜欢

热点阅读