2018-03-09


2018-03-21

45. 单例dispatch_once的使用
+ (SVProgressHUD*)sharedInstance {
    static dispatch_once_t once; //标记
    static SVProgressHUD *sharedView;//返回的对象
    dispatch_once(&once, ^ {
        sharedView = [[self alloc] initWithFrame:[[UIScreen mainScreen] bounds]];         
    });
    return sharedView;
}

说明:dispatch_once 是线程安全的,利用标记来记录块是否执行,为了保证代码只执行一次,必须保证每次传进的标记都是相同的,所以通常将标记声明在static 或者global 作用域;另外该方法效率高,比采用手动加锁效率高。

46. 不要使用dispatch_get_current_queue 方法
47. 熟悉系统的常用框架

1.框架是什么
2.动态库和静态库的区别

48. 遍历collection集合类多用块枚举,少用for 循环

通常三种方式遍历:

1.普通的for循环,和下标配合使用
2.object-c 1.0 提供的NSEnumerator枚举器
3.object-c 2.0 新增的for快速遍历(需要遵循fast enumerator 协议),和in 配合使用
4.iOS 4.0之后,引入了block(块),更方便

总结:1.枚举器和普通的for 循环区别不大,体现在语法,枚举定义了一些方便的反向遍历方法(reverse)

  1. 快速遍历效率最高,不依赖下标
  2. 块方式最新最先进,方便一次可以获取对象更多的信息,比如下标和值,还可以通过设置NS_OPTIONS开启并发的方式遍历
typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
    NSEnumerationConcurrent = (1UL << 0),
    NSEnumerationReverse = (1UL << 1),
};

2018-03-09

51. 精简initialize 和load 的实现代码

load:

  1. 对于实现了该方法load的类和分类,必定会调用改方法,而且仅调用一次;先类后分类调用。
  2. 在load 方法里面使用其他类是不安全的,因为当load 方法里面使用了其他的类,那么无法判断该类是否已经加载完成,另外也无法判断所有类的加载顺序
  3. 程序在执行load方法时都会阻塞,所有精简load实现的代码
  4. load方法不遵循继承规则,是否实现执行和父类没有关系,只和本身有没有实现有关系。

initialize:

  1. 程序首次使用该类之前调用一次,且仅一次。运行期系统调用。惰性调用,该类不被使用那么就不会调用该方法,这点也是与load 最大的区别;对于load 而已,应用程序必须阻塞并等待所有类的load 方法执行完成,才能继续。
  2. 运行期执行该方法的时候,系统是正常状态的,是安全的,而load 方法执行的时候系统处于"脆弱状态",调用其他方法是不安全的。
  3. initialize 方法遵循普通的继承规则:即使本身没有实现,但父类实现了,那么该类在首次使用的时候依旧会执行继承自父类的initialize方法,这一点和load 很不同。
@interface PeopleClass : NSObject
@end
@interface SubPeopleClass : PeopleClass
@end

@implementation PeopleClass
+ (void)initialize{
    NSLog(@"%@ %s \n",self,__func__);
}

@implementation SubPeopleClass
+ (void)load{
      NSLog(@"%@ %s \n",self,__func__);
}
@end
输出:
2018-03-09 11:33:21.855 test[78131:12703510] PeopleClass +[PeopleClass initialize] 
2018-03-09 11:33:21.857 test[78131:12703510] SubPeopleClass +[PeopleClass initialize] 
2018-03-09 11:33:21.857 test[78131:12703510] SubPeopleClass +[SubPeopleClass load] 

----------
@implementation PeopleClass
+ (void)initialize{
    NSLog(@"%@ %s \n",self,__func__);
}
@end
@implementation SubPeopleClass
+ (void)load{
      NSLog(@"%@ %s \n",self,__func__);
}
+ (void)initialize{
    NSLog(@"%@ %s \n",self,__func__);
}
@end
2018-03-09 11:38:33.486 test[78234:12709930] PeopleClass +[PeopleClass initialize] 
2018-03-09 11:38:33.487 test[78234:12709930] SubPeopleClass +[SubPeopleClass initialize] 
2018-03-09 11:38:33.487 test[78234:12709930] SubPeopleClass +[SubPeopleClass load] 

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,146评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 124,514评论 18 136
  • load 和 initialize 两个方法算是两个特殊的类方法了,今天偶然从草稿箱中看到还有本篇未完成的博文,如...
    RITL阅读 1,113评论 8 13
  • 一天,父亲做了两碗面条,端到饭桌上,儿子看着两碗面条,一碗面上有个荷包蛋,另一碗只有面条。父亲问儿子:“要哪碗”?...
    利萍阅读 108评论 0 0
  • 那天因为一个毕业班的学生想放弃学习,引发了我内心深处拯救问题学生的思考;也是在那一天,在微信朋友圈看到了叙...
    暖阳西子阅读 43评论 0 0