美文网首页
iOS load & initialize

iOS load & initialize

作者: 莫太极 | 来源:发表于2017-05-12 15:32 被阅读0次

想定义个可变数组在编译期初始化...正常全局状态初始化我们一般这样写

static const NSInteger kSearchInterval = 10;
static NSString * const uartServiceUUIDString = @"6E400001-B5A3-F393-E0A9-E50E24DCCA9E";

但是可变数组不行,

static NSMutableArray *kSomeArray = [NSMutableArray new];```
这样写编译器会报错,告诉你不应该在编译期定义。
既然不能在全局中定义,放在方法里总可以了吧

点进NSObject,找到两个方法,研究下
  • (void)load;

  • (void)initialize;```

+ (void) load

  • 对于加入运行期系统中的每个类及分类来说,必定会调用此方法,而且仅调用一次。当包含类或分类的程序库载入系统时,就会执行此方法,就是应用程序启动的时候。

  • 比较有意思的是load不遵从继承规则,如果某个类本身没实现load方法,那么不管其各级父类是否实现此方法,系统都不会调用。

  • load 方法务必实现的精简也就是要尽量减少其所执行的操作,整个应用程序在执行load方法时都会阻塞。

+ (void) initialize

对于每个类来说,该方法会在程序调用该类之前调用,且只调用一次。它是由运行期系统来调用的。

  • 它是“懒加载”的,也就是说,只有当程序用到了相关类时,才会调用。如果某个类一直没有使用,那么其initialize方法一直不会运行。也就是说程序无须把每个类的initialize方法都执行一遍。而load方法不同,程序必须阻塞并等着所有类的load都执行完才继续。
  • initialize方法与其他消息一样,如果某个类未实现它,而其父类实现了,那么会运行父类的代码。

对比两个方法得出结论:
load方法用起来比较危险,好像写什么都不好,仅仅可能调试程序用
initialize方法要好点,但是只应该用来设置内部数据。不应该调用其他方法,即便是本类自己的方法也别调用,那些方法稍后有可能添加更多功能

故 实现了initialize方法 在此方法里面初始化可变数组,搞定!搞定? 问题来了 我在这个方法里写了NSlog ,发现继承它的所有类都打印这个log了,即便子类没有实现这个方法。。

前面提到initialize方法是遵循继承法则的。所以当初始化子类时,由于并未覆写此方法,因而还要把父类的实现代码再运行一遍。鉴于此,应该在initialize方法里加条件判断:

static NSMutableArray *kSomeArray;

+(void)initialize{
    if (self == [SomeBaseClass class]) {
        NSLog(@"initialize %@ ", self);
        kSomeArray = [NSMutableArray new];
    }
}

到这应该算是OK了

相关文章

网友评论

      本文标题:iOS load & initialize

      本文链接:https://www.haomeiwen.com/subject/yoiztxtx.html